>pythonalpaca_converter.py\--data_path/home/workspace/data/alpaca_data.json\--output_path/home/workspace/data/alpaca-data-conversation.json>tree-h/home/workspace/data/home/workspace/data├──[35M]alpaca-data-conversation.json└──[22M]alpaca_data.json转换前格式:
[{"instruction":"Givethreetipsforstayinghealthy.","input":"","output":"1.Eatabalanceddietandmakesuretoincludeplentyoffruitsandvegetables.\n2.Exerciseregularlytokeepyourbodyactiveandstrong.\n3.Getenoughsleepandmaintainaconsistentsleepschedule."},{"instruction":"Whatarethethreeprimarycolors","input":"","output":"Thethreeprimarycolorsarered,blue,andyellow."},]转换后格式:
[{"id":"1","conversations":[{"from":"human","value":"Belowisaninstructionthatdescribesatask.Writearesponsethatappropriatelycompletestherequest.\n\n###Instruction:\nGivethreetipsforstayinghealthy.\n\n###Response:"},{"from":"gpt","value":"1.Eatabalanceddietandmakesuretoincludeplentyoffruitsandvegetables.\n2.Exerciseregularlytokeepyourbodyactiveandstrong.\n3.Getenoughsleepandmaintainaconsistentsleepschedule."}]},{"id":"2","conversations":[{"from":"human","value":"Belowisaninstructionthatdescribesatask.Writearesponsethatappropriatelycompletestherequest.\n\n###Instruction:\nWhatarethethreeprimarycolors\n\n###Response:"},{"from":"gpt","value":"Thethreeprimarycolorsarered,blue,andyellow."}]},]模型准备及模型格式转换本文使用LLaMA-13B作为多机多卡训练的基座模型,关于LLaMA的介绍已经太多,这里不再赘述,下面下载LLaMA-13B模型权重文件并换成HuggingFaceTransformers格式,有以下两种方案。
模型和数据集准备好之后,我们先来看一下基于昇腾910的AI集群的网络通信。
昇腾910通过自研的集合通信库(HCCL)整合了三种高速互联接口:PCIe、RoCEv2以及HCCS。通常情况下,NPU与CPU之间采用PCIe进行通信,服务器内的NPU之间则采用HCCS(组间)或PCIe(组间)进行通信,而服务器之间使用RoCE进行通信。
下面我们使用MindSpore进行多机多卡训练。
对于驱动、固件以及CANN工具集的安装和之前在昇腾910上面安装方式基本一致,找到对应版本的驱动、固件以及CANN工具集进行安装即可。
创建新的虚拟环境:
condacreate-nllama_clusterpython=3.7.5condaactivatellama_cluster安装MindSpore和MindFormers(MindSporeTransformers的简称)。
pipinstalltorchtransformers模型权重格式转换将HuggingfaceTransformers模型权重格式转换成MindFormers权重格式。
cd/home/workspace/code/mindformerspythonmindformers/models/llama/convert_weight.py\--torch_ckpt_dir/home/workspace/model/vicuna-13B\--mindspore_ckpt_path/home/worspace/model/vicuna-13B-ms数据集格式转换使用MindFormers进行模型训练时,需先将带有Prompt模板的数据集转换为MindRecord格式。
cd/home/workspace/code/mindformers/mindformers/tools/dataset_preprocess/llamapythonllama_preprocess.py\--input_glob'/home/workspace/data/alpaca-data-conversation.json'\--dataset_typeqa\--model_file/home/workspace/model/tokenizer.model\--seq_length1024\--repeat3\--shuffle1\--output_file/home/workspace/data/alpaca-fastchat1024.mindrecord参数说明:
首先,在每台服务器上面生成用于Ascend芯片分布式通信的芯片资源信息配置文件(RANK_TABLE_FILE)。AscendHCCL的RANK_TABLE_FILE文件提供Ascend分布式训练作业的集群信息。
python./mindformers/tools/hccl_tools.py--device_num"[0,8)"--server_ip=90.90.3.xxpython./mindformers/tools/hccl_tools.py--device_num"[0,8)"--server_ip=90.90.3.yy然后,合并每个机器上的RANK_TABLE_FILE文件。可以使用官网提供的脚本merge_hccl.py进行合并,也可以手动进行合并。
python./mindformers/tools/merge_hccl.pyhccl*.json合并后的文件如下所示。
{"version":"1.0","server_count":"2","server_list":[{"server_id":"90.90.3.xx","device":[{"device_id":"0","device_ip":"10.0.0.36","rank_id":"0"},...{"device_id":"7","device_ip":"10.0.0.48","rank_id":"7"}],"host_nic_ip":"reserve"},{"server_id":"90.90.3.yy","device":[{"device_id":"0","device_ip":"10.0.0.37","rank_id":"8"},...{"device_id":"7","device_ip":"10.0.0.49","rank_id":"15"}],"host_nic_ip":"reserve"}],"status":"completed"}之后,将合并后的RANK_TABLE_FILE文件分别复制到所有的机器上。
下面修改配置文件configs/llama/run_llama_13B.yaml将only_save_strategy改为True;同时,修改并行策略,目前支持纯数据并行(类似DeepSpeed的ZeRO3,会对模型进行切分)进行训练。
only_save_strategy:Trueparallel_config:data_parallel:16model_parallel:1pipeline_stage:1然后,启动训练任务生成模型切分策略文件。
#server1:cdscriptsbashrun_distribute.sh../hccl_2s_16p.json../configs/llama/run_llama_13b.yaml[0,8]train16#server2:cdscriptsbashrun_distribute.sh../hccl_2s_16p.json../configs/llama/run_llama_13b.yaml[8,16]train16根据策略文件,切分模型。
python./mindformers/tools/transform_ckpt.py\--src_ckpt_strategy''\--dst_ckpt_strategyoutput/strategy/ckpt_strategy_rank_0.ckpt\--src_ckpt_dir/home/zk/workspace/model/\--dst_ckpt_dir/home/zk/workspace/model/ckpt-multi-node\--prefix"checkpoint_"参数说明:
模型切分完成之后,接下来,修改配置文件configs/llama/run_llama_13B.yaml中,模型权重文件路径、数据集路径、模型超参数等配置信息。
#配置环境变量,使能GE,MS_GE_ATOMIC_CLEAN_POLICY算子内存复用,并将HCCL通信超时增大到600sexportMS_ENABLE_GE=1exportMS_GE_TRAIN=1exportMS_GE_ATOMIC_CLEAN_POLICY=1exportHCCL_CONNECT_TIMEOUT=600#server1:cdscriptsbashrun_distribute.sh../hccl_2s_16p.json../configs/llama/run_llama_13b.yaml[0,8]train16#server2:cdscriptsbashrun_distribute.sh../hccl_2s_16p.json../configs/llama/run_llama_13b.yaml[8,16]train16运行日志:
目前,在昇腾上面针对MindSpore和PyTorch框架的支持是不同的团队支持。因此,驱动、固件以及CANN工具集目前还没有办法使用同一套。因此,需要根据官方的要求选择对应的版本进行重新安装,安装方式和之前在昇腾910上面安装方式基本一致。
为了避免之前的环境干扰,创建新的虚拟环境:
condacreate-nllama_pytorch_clusterpython=3.7.5condaactivatellama_pytorch_cluster安装依赖。
pip3install--upgradepippip3installeinopssympyregexdecoratorscipysetuptoolsscmprompttoolkit安装PyTorch和PyTorch的适配插件torch_npu。
training_args.py->transformers/training_args.putrainer.py->transformers/trainer.pyversions.py->utils/versions.pymodeling_llama.py->transformers/models/llama/modeling_llama.py模型训练下面进行模型训练,本文使用Pytorch原生方式启动训练任务(除此之外,还可以采用DeepSpeed命令进行启动,需先安装pdsh,同时配置hostfile。)
显存占用:
当然,目前来看,AI框架趋于收敛,大模型算法架构也趋于收敛,对于像华为昇腾这样的AI软硬件平台发展其生态来说是好事,不需要疲于拼命做太多AI框架和模型的适配工作。