导读
10月16日,IDEA研究院(粤港澳大湾区数字经济研究院)CCNL封神榜团队开源中文基座模型Ziya2-13B-Base及其对话模型Ziya2-13B-Chat,两款模型均完全免费、可商用,已在魔搭社区首发上架。
评测结果显示,Ziya2-13B-Base 模型在中文、英文、数学、代码等下游理解任务上的表现均明显优于Llama2-13B和Ziya-LLaMA-13B。
魔搭推出了最佳实践教程,提前跑通模型的部署、推理和微调,供开发者参考。
环境配置与安装
- python 3.8及以上版本
- pytorch 1.12及以上版本,推荐2.0及以上版本
- 本文的QLoRA版本的SFT可在PAI-DSW的免费算力环境A10下运行 (显存要求13G)
pip install modelscope>=1.9.2
模型下载与链接
Ziya2-13B-Base
模型链接:
https://modelscope.cn/models/Fengshenbang/Ziya2-13B-Base/summary
模型weights下载:
from modelscope import snapshot_download model_dir = snapshot_download('Fengshenbang/Ziya2-13B-Base', revision = 'master')
Ziya2-13B-Chat
模型链接:
https://modelscope.cn/models/Fengshenbang/Ziya2-13B-Chat/summary
模型weights下载:
from modelscope import snapshot_download model_dir = snapshot_download('Fengshenbang/Ziya2-13B-Chat', revision='master')
模型推理
姜子牙2-13B-Base 推理代码:
from modelscope import AutoTokenizer from modelscope import AutoModelForCausalLM import torch query="问题:我国的三皇五帝分别指的是谁?答案:" model = AutoModelForCausalLM.from_pretrained('Fengshenbang/Ziya2-13B-Base', revision='master', torch_dtype=torch.float16, device_map="auto").eval() tokenizer = AutoTokenizer.from_pretrained('Fengshenbang/Ziya2-13B-Base', revision='master') input_ids = tokenizer(query, return_tensors="pt").input_ids.to('cuda:0') generate_ids = model.generate( input_ids, max_new_tokens=512, do_sample = True, top_p = 0.9) output = tokenizer.batch_decode(generate_ids)[0] print(output)
姜子牙2-13B-Chat 推理代码:
from modelscope import AutoTokenizer, AutoModelForCausalLM, snapshot_download import torch device = torch.device("cuda") messages = [{"role": "user", "content": "手机如果贴膜贴了一张防指纹的钢化膜,那屏幕指纹解锁还有效吗?"}] user_prefix = "<human>:" assistant_prefix = "<bot>:" separator = "\n" prompt = [] for item in messages: prefix = user_prefix if item["role"] == "user" else assistant_prefix prompt.append(f"{prefix}{item['content']}") prompt.append(assistant_prefix) prompt = separator.join(prompt) model_dir = snapshot_download('Fengshenbang/Ziya2-13B-Chat', revision='master') model = AutoModelForCausalLM.from_pretrained(model_dir,torch_dtype=torch.bfloat16).to(device) tokenizer = AutoTokenizer.from_pretrained(model_dir, use_fast=False) input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to(device) generate_ids = model.generate( input_ids, max_new_tokens=512, do_sample = True, top_p = 0.9, temperature = 0.85, repetition_penalty=1.05, eos_token_id=tokenizer.encode("</s>"), ) output = tokenizer.batch_decode(generate_ids)[0] print(output)
05
模型微调和微调后推理
微调代码开源地址:
https://github.com/modelscope/swift/tree/main/examples/pytorch/llm
clone swift仓库并安装环境
git clone https://github.com/modelscope/swift.git cd swift pip install . cd examples/pytorch/llm pip install -r requirements.txt -U
QLoRA微调Ziya2-13B-Chat
微调数据集:
https://modelscope.cn/datasets/AI-ModelScope/lawyer_llama_data/summary
QLoRA+DDP+DeepSpeed版本的sft.sh
# Experimental environment: 2 * A10 # 2 * 13GB GPU memory nproc_per_node=2 PYTHONPATH=../../.. \ CUDA_VISIBLE_DEVICES=0,1 \ torchrun \ --nproc_per_node=$nproc_per_node \ --master_port 29500 \ src/llm_sft.py \ --model_type ziya2-13b-chat \ --sft_type lora \ --template_type ziya \ --dtype bf16 \ --output_dir output \ --ddp_backend nccl \ --dataset lawyer-llama-zh \ --train_dataset_sample -1 \ --num_train_epochs 1 \ --max_length 2048 \ --quantization_bit 4 \ --bnb_4bit_comp_dtype bf16 \ --lora_rank 8 \ --lora_alpha 32 \ --lora_dropout_p 0. \ --lora_target_modules ALL \ --gradient_checkpointing true \ --batch_size 1 \ --weight_decay 0. \ --learning_rate 1e-4 \ --gradient_accumulation_steps $(expr 16 / $nproc_per_node) \ --max_grad_norm 0.5 \ --warmup_ratio 0.03 \ --eval_steps 100 \ --save_steps 100 \ --save_total_limit 2 \ --logging_steps 10 \ --push_to_hub false \ --hub_model_id ziya2-13b-chat-qlora \ --hub_private_repo true \ --hub_token 'your-sdk-token' \ --deepspeed_config_path 'ds_config/zero2.json' \ --only_save_model true \
QLoRA版本的sft.sh
# Experimental environment: A10 # 12GB GPU memory PYTHONPATH=../../.. \ CUDA_VISIBLE_DEVICES=0 \ python src/llm_sft.py \ --model_type ziya2-13b-chat \ --sft_type lora \ --template_type ziya \ --dtype bf16 \ --output_dir output \ --dataset lawyer-llama-zh \ --train_dataset_sample -1 \ --num_train_epochs 1 \ --max_length 2048 \ --quantization_bit 4 \ --bnb_4bit_comp_dtype bf16 \ --lora_rank 8 \ --lora_alpha 32 \ --lora_dropout_p 0. \ --lora_target_modules ALL \ --gradient_checkpointing true \ --batch_size 1 \ --weight_decay 0. \ --learning_rate 1e-4 \ --gradient_accumulation_steps 16 \ --max_grad_norm 0.5 \ --warmup_ratio 0.03 \ --eval_steps 100 \ --save_steps 100 \ --save_total_limit 2 \ --logging_steps 10 \ --push_to_hub false \ --hub_model_id ziya2-13b-chat-qlora \ --hub_private_repo true \ --hub_token 'your-sdk-token' \
模型微调后的推理脚本infer.sh
# Experimental environment: A10 # If you want to merge LoRA weight and save it, you need to set `--merge_lora_and_save true`. PYTHONPATH=../../.. \ CUDA_VISIBLE_DEVICES=0 \ python src/llm_infer.py \ --model_type ziya2-13b-chat \ --sft_type lora \ --template_type ziya \ --dtype bf16 \ --ckpt_dir "output/ziya2-13b-chat/vx_xxx/checkpoint-xxx" \ --eval_human false \ --dataset lawyer-llama-zh \ --max_length 2048 \ --quantization_bit 4 \ --bnb_4bit_comp_dtype bf16 \ --max_new_tokens 2048 \ --temperature 0.9 \ --top_k 20 \ --top_p 0.9 \ --do_sample true \ --merge_lora_and_save false \
微调的可视化结果
以下损失图由QLoRA+DDP+DeepSpeed版本的sft.sh生成
训练损失:
评估损失:
资源消耗:
ziya2-13B-Chat使用 qlora+ddp+deepspeed 的方式训练的显存占用如下,大约在2*13G.
ziya2-13B-Chat使用 qlora 的方式训练的显存占用如下,大约在12G.
创空间
创空间体验链接:https://modelscope.cn/studios/Fengshenbang/Ziya2_13B_chat/summary
子牙系列大模型将在2023云栖大会全面来Show
首席科学家面对面talk分享 / 现场动手体验子牙系列大模型 /...
2023.10.31-11.02 杭州 · 云栖小镇 门票有限 快来申领