前言

本篇文章,讲述如果在智算平台上完成分布式训练
主流程顺序如下:
1.先制作一台可训练的镜像
2.保存单台镜像
3.制作多机脚本
4.完成分布式训练

需要注意:
1.要挂载存储卷
2.要保持多机免密
3.要保证训练时多机环境一致

一、单台环境制作

1.平台环境准备

镜像选择:pytorch:v24.10-torch2.4.0-torchmlu1.23.1-ubuntu22.04-py310
卡选择:任意一款MLU3系列及以上卡

2.环境准备

swift代码准备

 git clone https://githubfast.com/modelscope/ms-swift.git
 #转换代码后,源码编译,至于为啥转换而不是添加代码,请往下看,上集回顾
 python /torch/src/torch_mlu/tools/torch_gpu2mlu/torch_gpu2mlu.py -i ms-swift/
 #源码编译
 pip install -e ./ms-swift_mlu/
 apt install pdsh -y
 pip install deepspeed_mlu-0.11.0-py3-none-any.whl #这个包私信要

在这里插入图片描述

3.模型下载

git-lfs clone https://www.modelscope.cn/Qwen/Qwen2-7B-Instruct.git

4.数据集准备

这里我们依然用广告词数据做演示

{"instruction": "类型#裤*版型#宽松*风格#性感*图案#线条*裤型#阔腿裤", "input": "", "output": "宽松的阔腿裤这两年真的吸粉不少,明星时尚达人的心头爱。毕竟好穿时尚,谁都能穿出腿长2米的效果宽松的裤腿,当然是遮肉小能手啊。上身随性自然不拘束,面料亲肤舒适贴身体验感棒棒哒。系带部分增加设计看点,还让单品的设计感更强。腿部线条若隐若现的,性感撩人。颜色敲温柔的,与裤子本身所呈现的风格有点反差萌。"}
{"instruction": "类型#裙*风格#简约*图案#条纹*图案#线条*图案#撞色*裙型#鱼尾裙*裙袖长#无袖", "input": "", "output": "圆形领口修饰脖颈线条,适合各种脸型,耐看有气质。无袖设计,尤显清凉,简约横条纹装饰,使得整身人鱼造型更为生动立体。加之撞色的鱼尾下摆,深邃富有诗意。收腰包臀,修饰女性身体曲线,结合别出心裁的鱼尾裙摆设计,勾勒出自然流畅的身体轮廓,展现了婀娜多姿的迷人姿态。"}
{"instruction": "类型#上衣*版型#宽松*颜色#粉红色*图案#字母*图案#文字*图案#线条*衣样式#卫衣*衣款式#不规则", "input": "", "output": "宽松的卫衣版型包裹着整个身材,宽大的衣身与身材形成鲜明的对比描绘出纤瘦的身形。下摆与袖口的不规则剪裁设计,彰显出时尚前卫的形态。被剪裁过的样式呈现出布条状自然地垂坠下来,别具有一番设计感。线条分明的字母样式有着花式的外观,棱角分明加上具有少女元气的枣红色十分有年轻活力感。粉红色的衣身把肌肤衬托得很白嫩又健康。"}
{"instruction": "类型#裙*版型#宽松*材质#雪纺*风格#清新*裙型#a字*裙长#连衣裙", "input": "", "output": "踩着轻盈的步伐享受在午后的和煦风中,让放松与惬意感为你免去一身的压力与束缚,仿佛要将灵魂也寄托在随风摇曳的雪纺连衣裙上,吐露出<UNK>微妙而又浪漫的清新之意。宽松的a字版型除了能够带来足够的空间,也能以上窄下宽的方式强化立体层次,携带出自然优雅的曼妙体验。"}
{"instruction": "类型#上衣*材质#棉*颜色#蓝色*风格#潮*衣样式#polo*衣领型#polo领*衣袖长#短袖*衣款式#拼接", "input": "", "output": "想要在人群中脱颖而出吗?那么最适合您的莫过于这款polo衫短袖,采用了经典的polo领口和柔软纯棉面料,让您紧跟时尚潮流。再配合上潮流的蓝色拼接设计,使您的风格更加出众。就算单从选料上来说,这款polo衫的颜色沉稳经典,是这个季度十分受大众喜爱的风格了,而且兼具舒适感和时尚感。"}
{"instruction": "类型#上衣*版型#h*材质#蚕丝*风格#复古*图案#条纹*图案#复古*图案#撞色*衣样式#衬衫*衣领型#小立领", "input": "", "output": "小女人十足的条纹衬衣,缎面一点点的复古,还有蓝绿色这种高级气质复古色,真丝材质,撞色竖条纹特别的现代感味道,直h型的裁剪和特别的衣长款式,更加独立性格。双层小立领,更显脸型。"}
{"instruction": "类型#裙*材质#网纱*颜色#粉红色*图案#线条*图案#刺绣*裙腰型#高腰*裙长#连衣裙*裙袖长#短袖*裙领型#圆领", "input": "", "output": "这款连衣裙,由上到下都透出一丝迷人诱惑的女性魅力,经典圆领型,开口度恰好,露出你的迷人修长的脖颈线条,很是优雅气质,短袖设计,在这款上竟是撩人美貌,高腰线,散开的裙摆,到小腿的长度,遮住了腿部粗的部分,对身材有很好的修饰作用,穿起来很女神;裙身粉红色花枝重工刺绣,让人一眼难忘!而且在这种网纱面料上做繁复图案的绣花,是很考验工艺的,对机器的要求会更高,更加凸显我们的高品质做工;"}
{"instruction": "类型#上衣*颜色#纯色*图案#纯色*图案#文字*图案#印花*衣样式#卫衣", "input": "", "output": "一款非常简洁大方的纯色卫衣,设计点在于胸前的“<UNK><UNK>”的中文字印花,新颖特别,让人眼前一亮。简单又吸睛的款式,而且不失时髦感,很适合个性年轻人。"}

5.单机训练脚本准备

NPROC_PER_NODE=$(cnmon info | grep Card | wc -l) \
MLU_VISIBLE_DEVICES=$(seq -s, 0 $((NPROC_PER_NODE - 1))) \
swift sft \
    --model_type qwen2 \
    --model  /workspace/volume/guojunceshi2/Qwen2-7B-Instruct \
    --dataset train.jsonl \
    --val_dataset val.jsonl \
    --output_dir output \
    --deepspeed /workspace/volume/guojunceshi2/fenbushi/ms-swift_mlu/swift/llm/ds_config/zero2.json

6.单台训练效果展示

在这里插入图片描述

7.平台保存镜像

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

至此单机准备完毕,接着开始多机训练

二、多机多卡训练

1.平台环境准备

1.节点数选择多节点
2.卡数后面规格选择带IB的,HYG-4*370-5.10.22-IB
3.镜像选择我们刚才保存的镜像
4.记得挂存储卷

2.多机脚本准备

首先我们先查看下两个节点状态

(pytorch) root@notebook-swift2-1210-134224-5dqsby-notebook-0:/workspace# cat /root/.ssh/config 
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
Host notebook-swift2-1210-134224-5dqsby-notebook-0
  HostName notebook-swift2-1210-134224-5dqsby-notebook-0.notebook-swift2-1210-134224-5dqsby
Host notebook-swift2-1210-134224-5dqsby-worker-0
  HostName notebook-swift2-1210-134224-5dqsby-worker-0.notebook-swift2-1210-134224-5dqsby

主节点脚本

NNODES=2 \
NODE_RANK=0 \
MASTER_ADDR=10.9.29.10 \  #ip是主节点ip
NPROC_PER_NODE=$(cnmon info | grep Card | wc -l) \
MLU_VISIBLE_DEVICES=$(seq -s, 0 $((NPROC_PER_NODE - 1))) \
swift sft \
    --model_type qwen2 \
    --model  /workspace/volume/guojunceshi2/Qwen2-7B-Instruct \
    --dataset train.jsonl \
    --val_dataset val.jsonl \
    --output_dir output \
    --deepspeed /workspace/volume/guojunceshi2/fenbushi/ms-swift_mlu/swift/llm/ds_config/zero2.json

子节点脚本

NNODES=2 \
NODE_RANK=1 \
MASTER_ADDR=10.9.29.10 \
NPROC_PER_NODE=$(cnmon info | grep Card | wc -l) \
MLU_VISIBLE_DEVICES=$(seq -s, 0 $((NPROC_PER_NODE - 1))) \
swift sft \
    --model_type qwen2 \
    --model  /workspace/volume/guojunceshi2/Qwen2-7B-Instruct \
    --dataset train.jsonl \
    --val_dataset val.jsonl \
    --output_dir output \
    --deepspeed /workspace/volume/guojunceshi2/fenbushi/ms-swift_mlu/swift/llm/ds_config/zero2.json

3.多机训练效果展示

在这里插入图片描述

三、训练效果推理

命令行演示

NPROC_PER_NODE=0
swift infer \
    --ckpt_dir /workspace/volume/guojunceshi2/fenbushi/output/v2-20241210-135834/checkpoint-500 \
    --stream true
[INFO:swift] Start time of running main: 2024-12-10 14:09:26.110555
[INFO:swift] Global seed set to 42
[INFO:swift] Input `exit` or `quit` to exit the conversation.
[INFO:swift] Input `multi-line` to switch to multi-line input mode.
[INFO:swift] Input `reset-system` to reset the system and clear the history.
[INFO:swift] Input `clear` to clear the history.
<<< 衣服,鞋子裤子
Starting from v4.46, the `logits` model output will have the same type as the model (except at train time, where it will always be FP32)
这款来自BRAND的男士运动裤,采用纯黑配色,时尚百搭。腰部采用松紧带设计,穿着舒适不紧绷。侧边斜插口袋设计,方便实用From v4.47 onwards, when a model cache is to be returned, `generate` will return a `Cache` instance instead by default (as opposed to the legacy tuple of tuples format). If you want to keep returning the legacy format, please set `return_legacy_cache=True

代码效果演示

from transformers import AutoModelForCausalLM, AutoTokenizer
device = "mlu" # the device to load the model onto

model = AutoModelForCausalLM.from_pretrained(
    "/workspace/volume/guojunceshi2/Qwen2-7B-Instruct",
    torch_dtype=torch.float16,
    device_map="auto"
)
model.load_adapter("/workspace/volume/guojunceshi2/fenbushi/output/v2-20241210-135834/checkpoint-500")
tokenizer = AutoTokenizer.from_pretrained("/workspace/volume/guojunceshi2/Qwen2-7B-Instruct")

prompt = "衣服,裤子鞋子."
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)

generated_ids = model.generate(
    model_inputs.input_ids,
    max_new_tokens=512
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

训练前

问:衣服,裤子鞋子
答:"衣服、裤子、鞋子" 是中文,分别指的是:

1. **衣服** - 包括上衣、外套、裙子等,是覆盖和保护人体的物品。
2. **裤子** - 一种下身穿着的服装,通常与上衣搭配使用。
3. **鞋子** - 用于保护脚部并提供支撑和舒适度的装备。

这些衣物在日常生活中不可或缺,它们不仅满足了基本的功能需求,如保暖、保护身体,还承担着时尚表达和个人风格展现的角色。

推理后

问:衣服,裤子鞋子
答:<UNK>的这款<UNK>,采用的是优质面料,柔软舒适。在设计上,采用的是简洁大方的设计风格,简单大气。

结束~

Logo

更多推荐