Package: hcgf
hcgfA Humanable Chat Generative-model Fine-tuning tool.Installpipinstallhcgf安装依赖：pip install -r requirements.txt建议使用PyTorch2.0。未支持多节点。Fine-tuning支持的模型：ChatGLMChatGLM2QwenLinly LLaMABELLE LLaMAZiya LLaMABaichuan LLaMABloomPanguDataset每一行一个dict的.json文件，必须包含prompt和completion两个字段。示例如下：{"prompt":"你是谁？","completion":"不告诉你。"}Command Fine-tuning支持分布式Zero3、Zero2和DDP模式，使用方法请参考帮助文档。hcgf_tune-h至少要指定model和data_path参数，如下。hcgf_tune--modelTHUDM/chatglm-6b--data_pathpath/to/train_data.jsonlora首先要理解一下，模型训练时，除了模型（也就是参数）占用的空间外，还有优化器、梯度等会占用显存。一共五种策略：fsdp_zero3：命令行模式默认策略，FULL_SHARD，参数、梯度、优化器状态SHARD，慢但是省显存，数据并行。fsdp_zero2：GRAD_OP_SHARD，梯度、优化器状态SHARD，比上面那个快一些，数据并行。mpdp(ddp)：NO_SHARD，类似DDP，就是把模型分别加载到每张卡上，比上面2个都快，数据并行。mpds(8bit)：8bit模式（下面的《8bit Fine-tuning》），模型被分到多个卡（甚至CPU）上，没有数据并行，很慢。msds(single_gpu)：单卡模式（下面的《Single Device Fine-tuning》），能跑起来的情况下比较快。卡数显存训练数据策略多卡单卡跑不起模型数据很多fsdp_zero3/fsdp_zero2单卡跑得起模型数据很多mpdp单卡跑不起模型数据很少mpds单卡跑得起模型数据很少msds单卡单卡跑不起模型-mpds单卡跑得起模型-msds注意事项：这里显存是在训练模式下的，和推理模式占用不同，可参考下面的《Configuration》。推理只支持后两种模式。FSDP模式下可能还没有单卡快（单卡跑得起的时候），这是正常的，因为FSDP对数据分片了，而且为了更大限度地使用显存，还可能需要把一些数据倒腾到CPU。分布式训练下，batch_size其实是per_device_batch_size，真正的batch_size相当于device_num×per_device_batch_size。也就是说，同样的batch_size、数据和配置下，单卡比多卡更新的次数多。如果有accumulate_steps参数，则需要再乘以它才是真正更新参数的batch_size。Single Device Fine-tuning至少需要一张16G显存的卡。如果不指定显卡，默认为cuda。#===== 微调 =====#importhcgfgl=hcgf.GlmLora("THUDM/chatglm-6b",device="cuda:0")gl.load_data("/path/to/data.json").tune()#===== 推理 =====#gl=hcgf.GlmLora("THUDM/chatglm-6b",device="cuda:0")gl.load_pretrained("/path/to/lora_pt").eval()gl.chat("你是谁?")#===== 切换模式 =====#gl=hcgf.GlmLora("THUDM/chatglm-6b",device="cuda:0")gl.load_data("/path/to/data.json").tune()# 切换到推理模式gl.eval()gl.chat("你是谁？")# 切换回微调模式，还是用原来的数据继续跑gl.tune()# 如果有新的数据集，参考上面的写法，先加载数据gl.load_data("/path/to/new_data.json").tune()# 如果在原来的基础上用新数据继续微调，先加载之前的pt文件，再加载数据微调gl.load_pretrained("/path/to/lora_pt").load_data("/path/to/new_data.json").tune()当然，也可以使用hcgf_tune:hcgf_tunestrategymsds--modelTHUDM/chatglm-6b--data_pathpath/to/train_data.jsonlora8bit Fine-tuning至少需要一张12G显存的卡。不指定device。只需要初始化时改一下即可，其他操作和上面正常微调一样。需要安装依赖:bitsandbytesgl=hcgf.GlmLora("THUDM/chatglm-6b",load_in_8bit=True)当然，也可以使用hcgf_tune:hcgf_tunestrategympds--modelTHUDM/chatglm-6b--data_pathpath/to/train_data.jsonloraContinually Fine-tuning先加载之前的pt文件，然后加载数据微调。gl.load_pretrained("/path/to/lora_pt").load_data("/path/to/new_data.json").tune()Demo/Inference请执行hcgf_infer -h查看帮助。Parameters主要方法参数，有值的表示默认值。load_data(data_path:str,max_seq_len:int=512,# 句子最大长度，超过会截断。注意，这里指Prompt或Completion的长度，应保证两者长度之和不大于模型最大长度。)tune(batch_size:int=8,lr:float=2e-4,num_epochs:int=3,warmup_steps:Optional[int]=None,# 为None时会用1/3个Epoch进行warmupaccumulate_steps:Optional[int]=None,# 为None时等价于1out_dir:str="./output/",print_every:Optional[int]=None,# 为None时每1/10Epoch个Steps打印一次输出（Step、Loss、LearningRate）)# 未说明参数含义同`chat`generate(sents:Union[str,List[str]],# 输入的句子，可以是str或列表（多个输入），**注意**需要根据训练样本格式构造好输入。do_sample:bool=True,num_beams:int=1,temperature:float=0.2,top_p:float=0.7,repetition_penalty:float=1.02,)# ChatGLM onlychat(inp:str,history:List[Tuple[str,str]]=None,# (问，答)Pair对max_new_tokens:int=512,# 生成的文本最大长度，Prompt的长度=支持的最大长度-max_new_tokens，Prompt长度超过会被截断do_sample:bool=True,# 采样num_beams:int=1,# Beam Search 的 beam 数量temperature:float=0.95,# 越小越确定，越大越随机，比如你微调后可以把它改成0.1top_p:float=0.7,# 同上，两者不要同时调repetition_penalty:float=1.02,# 生成内容重复惩罚，越大越不容易重复stop:List[str]=[]# 停止文本，可以是标点、特定词或句子等，输出不包含停止文本)Better Practice:一般只需调整temerature。Configuration有几个影响显存的参数可以配置：max_seq_len，batch_size。(gl.load_data("./data/chatgpt_finetune_faq.json",max_seq_len=128).tune(batch_size=1))以下配置针对ChatGLM-6B。不同配置8bit资源占用：max_seq_lenbatch_sizememory64111G128112G512122G128215G128421G不同配置正常资源占用：max_seq_lenbatch_sizememory64115G128116G512130G128219G128425GRM使用小模型（如BERT等）训练。TrainingDataset需要pair对数据，计算logits过程和普通预训练模型一样（一个Batch多个pair对）；计算loss时属于同一个pair对的logits放一块算。推理时直接用logits就行。Test# 全部测试python-mpytest# 测试训练和推理，比较慢python-mpytest-s-mslow# 测试其他的python-mpytest-m"not slow"Other如果遇到加载超时，可以直接load本地cache下的模型：GlmLora("/path/to/huggingface/models--THUDM--chatglm-6b/snapshots/<id>/")ChangeLogv0.4.020230909支持Qwen、ChatGLM2、Baichuan等支持IA3微调v0.3.020230526支持LLaMA（包括Native、Alpaca、Ziya等）v0.2.020230513支持分布式微调调整推理模式，支持Batchv0.1.020230412支持ChatGLM新版Tokenizer使用官方调整后的MASK方式v0.0.720230405