华为云用户手册

  • MA-Advisor命令总览 MA-Advisor当前支持如下四种命令: analyze:根据Profiling单卡数据进行相关调优分析,并给出调优建议。 query:根据Profiling单卡timeline数据,输入算子相关参数,查询出算子详细信息。 env:对当前昇腾环境进行运行前预检查,分析出相关环境问题,并给出环境检查修复建议。 update: 更新用于分析的知识库,将云端知识库同步至分析环境中。 auto-completion:自动补全模式,在终端中自动完成MA-Advisor命令补全,支持“bash(默认)/zsh/fish”。 在执行任何命令前,若对其参数有疑问,可执行-h进行查看帮助,例如: ma-advisor analyze -h 图1 查看帮助
  • 训练支持的模型列表 本方案支持以下模型的训练,如表1所示。 表1 支持的模型 序号 支持模型 支持模型参数量 1 llama2 llama2-7b 2 llama2-13b 3 llama2-70b 4 llama3 llama3-8b 5 llama3-70b 6 Qwen qwen-7b 7 qwen-14b 8 qwen-72b 9 Qwen1.5 qwen1.5-7b 10 qwen1.5-14b 11 qwen1.5-32b 12 qwen1.5-72b 13 Yi yi-6b 14 yi-34b 15 ChatGLMv3 glm3-6b 16 Baichuan2 baichuan2-13b
  • 操作流程 图1 操作流程图 表2 操作任务流程说明 阶段 任务 说明 准备工作 准备环境 本教程案例是基于ModelArts Lite DevServer运行的,需要购买并开通DevServer资源。 准备代码 准备AscendSpeed训练代码、分词器Tokenizer和推理代码。 准备数据 准备训练数据,可以用本案使用的数据集,也可以使用自己准备的数据集。 准备镜像 准备训练模型适用的容器镜像。 预训练 预训练 介绍如何进行预训练,包括训练数据处理、超参配置、训练任务、断点续训及性能查看。 微调训练 SFT全参微调 介绍如何进行SFT全参微调。 LoRA微调训练 介绍如何进行LoRA微调训练。
  • Step2 创建OBS桶 ModelArts使用对象存储服务(Object Storage Service,简称OBS)进行数据存储以及模型的备份和快照,实现安全、高可靠和低成本的存储需求。因此,在使用ModelArts之前通常先创建一个OBS桶,然后在OBS桶中创建文件夹用于存放数据。 本文档需要将运行代码以及输入输出数据存放OBS,请提前创建OBS(参考创建OBS桶),例如桶名:sdxl-train。并在该桶下创建文件夹目录用于后续存储代码使用,例如:code。
  • Step7 创建训练作业 创建训练作业,填下如下参数。 创建方式:选择自定义算法,启动方式选择自定义,然后选择上传到SWR的自定义镜像。 代码目录:选择上传到OBS的代码文件夹,例如/sdxl-train/code。若用户需要修改代码文件,可修改OBS桶中代码文件,创建训练作业时,会将OBS的code目录拷贝到训练容器的/home/ma-user/sdxl-train/user-job-dir/目录下,覆盖容器中原有的code目录。 启动命令:直接运行启动脚本文件diffusers_finetune_train.sh。 sh /home/ma-user/sdxl-train/user-job-dir/code/diffusers_finetune_train.sh 本地代码目录:保持默认即可。 工作目录:选择代码文件目录,例如/home/ma-user/sdxl-train/user-job-dir/code/。 输出:单击“增加训练输出”,将模型保存到OBS中。参数名称为output,数据存储位置选择OBS桶中制定文件夹,例如sdxl-train/checkpoint,获取方式选择环境变量,/home/ma-user/modelarts/outputs/output_0下的模型文件会保存到OBS中。 图4 选择镜像 资源池:选择专属资源池,规格选择Ascend: 8*ascend-snt9b。如果需要多机训练,增加计算节点个数即可,启动脚本文件diffusers_finetune_train.sh支持多机训练。 图5 选择资源池规格 作业日志路径:选择输出日志到OBS的指定目录。 图6 选择作业日志路径 填写参数完成后,提交创建训练任务,训练完成后,作业状态会显示为已完成。 图7 训练完成
  • Step4 下载模型依赖包 请在如下链接中下载好模型依赖包。 下载stable-diffusion-xl-base-1.0,官网下载地址:https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main 下载vae-fp16-fix,官网下载地址:https://huggingface.co/madebyollin/sdxl-vae-fp16-fix/tree/main
  • 获取软件和镜像 表1 获取软件和镜像 分类 名称 获取路径 插件代码包 AscendCloud-3rdAIGC-6.3.905-xxx.zip 文件名中的xxx表示具体的时间戳,以包名发布的实际时间为准。 获取路径:Support-E 如果没有软件下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像包 swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc2-py_3.9-hce_2.0.2312-aarch64-snt9b-20240528150158-b521cc0 SWR上拉取 表2 模型镜像版本 模型 版本 CANN cann_8.0.rc2 PyTorch 2.1.0
  • Step2 修改训练超参配置 以 llama2-70b 和 llama2-13b 预训练 为例,执行脚本为 0_pl_pretrain_70b.sh 和 0_pl_pretrain_13b.sh 。 修改模型训练脚本中的超参配置,必须修改的参数如表1所示。其他超参均有默认值,可以参考表1按照实际需求修改。 表1 必须修改的训练超参配置 参数 示例值 参数说明 ORIGINAL_TRAIN_DATA_PATH /home/ma-user/ws/llm_train/AscendSpeed/training_data/pretrain/alpaca.parquet 必须修改。训练时指定的输入数据路径。请根据实际规划修改。 ORIGINAL_HF_WEIGHT /home/ma-user/ws/llm_train/AscendSpeed/model/llama2-70B 必须修改。加载tokenizer与Hugging Face权重时,对应的存放地址。请根据实际规划修改。 对于ChatGLMv3-6B和Qwen系列模型,还需要手动修改tokenizer文件,具体请参见训练tokenizer文件说明。
  • 操作流程 图1 操作流程图 表1 操作任务流程说明 阶段 任务 说明 准备工作 准备环境 本教程案例是基于ModelArts Lite DevServer运行的,需要购买并开通DevServer资源。 准备代码 准备AscendSpeed训练代码、分词器Tokenizer和推理代码。 准备数据 准备训练数据,可以用Alpaca数据集,也可以使用自己准备的数据集。 准备镜像 准备训练模型适用的容器镜像。 预训练 预训练 介绍如何进行预训练,包括训练数据处理、超参配置、训练任务、断点续训及性能查看。 微调训练 SFT全参微调 介绍如何进行SFT全参微调。 LoRA微调训练 介绍如何进行LoRA微调训练。 推理前的权重转换 - 模型训练完成后,可以将训练产生的权重文件用于推理。推理前参考本章节,将训练后生成的多个权重文件合并,并转换成Huggingface格式的权重文件。 如果无推理任务或者使用开源Huggingface权重文件进行推理,可以忽略此章节。和本文档配套的推理文档请参考《开源大模型基于DevServer的推理通用指导》。
  • 将多个权重文件合并为一个文件并转换格式 任意并行切分策略的Megatron权重 格式转化为 HuggingFace权重 (该场景一般用于将训练好的megatron模型:预训练、lora、sft 重新转回HuggingFace格式)为下一步推理使用准备,无推理任务忽略此章节,一般训练都是多卡分布式训练权重结果文件为多个且文件为Megatron格式,因此需要合并多个文件转换为huggingface格式 如是多机训练转换前需将多机权重目录(iter_xxxxxxx)下mp_rank_xx_xxx文件夹整合到一起后进行转换,合并后结果如图所示: 该脚本的执行需要在/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink目录下执行。具体执行步骤如下: 以lora微调训练权重结果Megatron权重 格式转化为 HuggingFace权重为例 #进入ModelLink目录下: cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink # 执行权重格式转换脚本:2_convert_mg_hf.sh LOAD_DIR=/home/ma-user/ws/saved_dir_for_ma_output/GLM3-6B/lora SAVE_DIR=/home/ma-user/ws/tokenizers/GLM3-6B CONVERT_HFTOMG=False sh ../scripts/glm3/2_convert_mg_hf.sh 其脚本2_convert_mg_hf.sh参数说明: save-model-type:输出后权重格式如(save_huggingface_qwen、save_huggingface_llama等)。 megatron-path:megatron模型路径,在代码xxx-Ascend/llm_train/AscendSpeed/ModelLink目录下 load-dir:${LOAD_DIR} 训练完成后保存的权重路径.如lora微调、sft、预训练生成的权重结果。 save-dir:${SAVE_DIR} 需要填入原始HF模型路径,新权重会存于../GLM3-6B/mg2hg下。 target-tensor-parallel-size:任务不同调整参数target-tensor-parallel-size。默认为1 target-pipeline-parallel-size :任务不同调整参数target-pipeline-parallel-size。默认为1 add-qkv-bias:为像qkv这样的键和值添加偏差。 loader:权重转换时要加载检查点的模型名称。 saver:权重转换时加载检查模型保存名称。 CONVERT_HFtoMG:权重转换类型是否为HuggingFace权重转换为Megatron格式,True :HuggingFace权重转换为Megatron,反之False为Megatron格式转换HuggingFace格式 # 转换后的权重文件结构 ├── config.json ├── configuration_chatglm.py ├── generation_config.json ├── model-00001-of-00003.safetensors ├── model-00002-of-00003.safetensors ├── model-00003-of-00003.safetensors ├── model.safetensors.index.json ├── modeling_chatglm.py ├── quantization.py
  • Step4 运行并验证SDXL模型 首先在容器中运行命令。 cd /home/ma-user/stable-diffusion-webui source /usr/local/Ascend/ascend-toolkit/set_env.sh 在/home/ma-user目录下已经存在launch.py脚本文件,启动launch.py命令如下。 python3 launch.py --skip-torch-cuda-test --port 8183 --enable-insecure-extension-access --listen --log-startup --disable-safe-unpickle --skip-prepare-environment --api 启动成功后,打印如下信息。 图2 启动成功 使用http://{宿主机ip}:8183 可以访问前端页面,通过输入文字生成图片。 图3 文生图 注意开启fa优化按钮。 图4 开启fa优化按钮 如果使用涉黄文字,输出的图片会返回黑图,用于验证safety-checker功能。同时,服务端会打印如下信息。 图5 服务端返回信息 带controlnet运行,默认使用canny。 图6 带controlnet运行 可以观察到输出的图片与canny输入图片很相近,坐姿和样子比较符合,如下图所示。 图7 文生图 使用后台API调用文生图接口。 curl -kv -X POST localhost:8183/sdapi/v1/txt2img -H "Content-Type: application/json" -d '{"prompt":"a dog"}' 客户端返回图像的base64编码,将base64编码再转换为图片,转换代码如下。 from PIL import Image from io import BytesIO import base64 def base64_to_image(base64_str): image = base64.b64decode(base64_str, altchars=None, validate=False) image = BytesIO(image) image = Image.open(image) image.save("./out_put_image.png")
  • Step3 安装依赖 在容器中执行如下命令,安装pip依赖。 cd /home/ma-user/stable-diffusion-webui pip install --upgrade pip pip install -r requirements.txt --no-deps pip install lightning_utilities torchmetrics gradio_client matplotlib pydantic aiofiles starlette ffmpy pydub uvicorn orjson semantic_version altair antlr4-python3-runtime==4.8.0 ftfy regex pytorch_lightning==1.6.5 gitdb trampoline clip aenum facexlib torch==2.1.0 python-multipart gdown pip install -r requirements_versions.txt pip install httpx==0.24.1 pip install diffusers 安装Stable Diffusion依赖。 下载stablediffusion-main.zip文件解压后,重命名为stable-diffusion-stability-ai,然后拷贝到容器stable-diffusion-webui/repositories/目录下。stablediffusion-main.zip文件的官网下载地址:https://github.com/Stability-AI/stablediffusion。 docker cp stable-diffusion-stability-ai sdwebui:/home/ma-user/stable-diffusion-webui/repositories/ 如果stable-diffusion-webui/repositories/目录不存在,需要通过mkdir创建。 下载generative-models-main.zip文件解压后,重命名为generative-models,然后拷贝到容器stable-diffusion-webui/repositories/目录下。generative-models-main.zip文件的官网下载地址:https://github.com/Stability-AI/generative-models.git。 docker cp generative-models sdwebui:/home/ma-user/stable-diffusion-webui/repositories/ 下载k-diffusion-master.zip文件解压后,重命名为k-diffusion,然后拷贝到容器stable-diffusion-webui/repositories/目录下。k-diffusion-master.zip文件的官网下载地址:https://github.com/Stability-AI/k-diffusion。 docker cp k-diffusion sdwebui:/home/ma-user/stable-diffusion-webui/repositories/ # 修改文件夹权限 docker exec -it --user root sdwebui bash chown -R ma-user:ma-group stable-diffusion-webui/repositories/ 安装vaeapprox-sdxl.pt。 下载vaeapprox-sdxl.pt文件后,拷贝到容器/home/ma-user/stable-diffusion-webui/models/VAE-approx/目录下。vaeapprox-sdxl.pt的官网下载地址:https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/tag/v1.0.0-pre。 docker cp vaeapprox-sdxl.pt sdwebui:/home/ma-user/stable-diffusion-webui/models/VAE-approx/ # 修改文件夹权限 docker exec -it --user root sdwebui bash chown -R ma-user:ma-group stable-diffusion-webui/models/VAE-approx/
  • Step2 下载软件包 下载stable-diffusion-webui-1.7.0.zip文件后解压,重命名为stable-diffusion-webui,然后拷贝到容器/home/ma-user目录下。 sdwebui 1.7.0版本软件包的官网下载地址:https://github.com/AUTOMATIC1111/stable-diffusion-webui/tree/v1.7.0 docker cp stable-diffusion-webui sdwebui:/home/ma-user/ 修改文件夹权限。启动容器时默认用户为ma-user用户,在使用其他属组如root用户上传的数据和文件时,可能会存在权限不足的问题。 # 修改文件夹权限(注意:重新启动一个终端,使用root用户登录容器修改文件权限,修改完后关闭终端。) docker exec -it --user root sdwebui bash chown -R ma-user:ma-group stable-diffusion-webui 下载SD基础模型,并拷贝到容器/home/ma-user/stable-diffusion-webui/models/Stable-diffusion目录下。 SD基础模型的官网下载地址。 https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors docker cp sd_xl_base_1.0.safetensors sdwebui:/home/ma-user/stable-diffusion-webui/models/Stable-diffusion/ docker cp v1-5-pruned-emaonly.safetensors sdwebui:/home/ma-user/stable-diffusion-webui/models/Stable-diffusion/ # 修改文件夹权限 docker exec -it --user root sdwebui bash chown -R ma-user:ma-group stable-diffusion-webui/models/Stable-diffusion/ 下载controlnet插件sd-webui-controlnet-main.zip文件后解压,重命名为sd-webui-controlnet,然后拷贝到容器stable-diffusion-webui/extensions/目录下。 controlnet插件的官网下载地址:https://github.com/Mikubill/sd-webui-controlnet。 docker cp sd-webui-controlnet sdwebui:/home/ma-user/stable-diffusion-webui/extensions/ # 修改文件夹权限 docker exec -it --user root sdwebui bash chown -R ma-user:ma-group stable-diffusion-webui/extensions/ 根据需要下载controlnet模型,放在/home/ma-user/stable-diffusion-webui/extensions/sd-webui-controlnet/models目录下。 docker cp control_v11p_sd15_canny.pth sdwebui:/home/ma-user/stable-diffusion-webui/extensions/sd-webui-controlnet/models/ docker cp control_v11p_sd15_canny.yaml sdwebui:/home/ma-user/stable-diffusion-webui/extensions/sd-webui-controlnet/models/ docker cp diffusers_xl_canny_mid.safetensors sdwebui:/home/ma-user/stable-diffusion-webui/extensions/sd-webui-controlnet/models/ # 修改文件夹权限 docker exec -it --user root sdwebui bash chown -R ma-user:ma-group stable-diffusion-webui/extensions/sd-webui-controlnet/models/ controlnet模型官网下载地址: https://huggingface.co/lllyasviel/ControlNet-v1-1/tree/main https://huggingface.co/lllyasviel/sd_control_collection/tree/main 选择下载sd1.5 canny: https://huggingface.co/lllyasviel/ControlNet-v1-1/blob/main/control_v11p_sd15_canny.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/blob/main/control_v11p_sd15_canny.yaml 选择下载sdxl canny: https://huggingface.co/lllyasviel/sd_control_collection/blob/main/diffusers_xl_canny_mid.safetensors 安装插件代码包。 将获取到的插件代码包ascendcloud-aigc-6.3.902-*.tar.gz文件上传到容器的/home/ma-user/temp目录下。获取路径:Support网站。 解压插件代码包ascendcloud-aigc-6.3.902-*到/home/ma-user/temp目录下。 tar -zxvf ascendcloud-aigc-6.3.902-*.tar.gz #解压 再解压ascendcloud-aigc-extensions-webui.tar.gz tar -zxvf ascendcloud-aigc-extensions-webui.tar.gz 拷贝NPU插件代码webui_npu_extension拷贝到stable-diffusion-webui/extensions/目录下。 cp -rf webui_npu_extension /home/ma-user/stable-diffusion-webui/extensions/ 拷贝safety-checker代码到/home/ma-user/stable-diffusion-webui/modules/目录下。 cp third_paties/stable-diffusion-webui/safety_checker.py /home/ma-user/stable-diffusion-webui/modules/ 然后在/home/ma-user/stable-diffusion-webui/modules/目录下,修改processing.py文件。 cd /home/ma-user/stable-diffusion-webui/modules sed -i '17 i\from modules.safety_checker import check_safety' processing.py sed -i '621 i\ x_checked_image = sample.cpu().unsqueeze(0).permute(0, 2, 3, 1).numpy()' processing.py sed -i '622 i\ x_checked_image, has_nsfw_concept = check_safety(x_checked_image)' processing.py sed -i '623 i\ sample = torch.tensor(x_checked_image).permute(0, 3, 1, 2).squeeze(0).to(sample.device)' processing.py sed -i 's#\r##g' processing.py 下载safety-checker模型包。 safety-checker的官网下载地址:https://huggingface.co/CompVis/stable-diffusion-safety-checker/tree/main 在宿主机当前目录下创建CompVis/stable-diffusion-safety-checker目录,然后下载所有文件,如下图所示。 图1 下载文件 然后将CompVis目录整个拷贝到/home/ma-user/stable-diffusion-webui目录下。 docker cp CompVis sdwebui:/home/ma-user/stable-diffusion-webui/ # 修改文件夹权限 docker exec -it --user root sdwebui bash chown -R ma-user:ma-group stable-diffusion-webui/CompVis
  • Step1 准备环境 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 购买DevServer资源时如果无可选资源规格,需要联系华为云技术支持申请开通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。 检查环境。 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info 如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装NPU设备和驱动,或释放被挂载的NPU。 检查docker是否安装。 docker -v #检查docker是否安装 如尚未安装,运行以下命令安装docker。 yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。 sysctl -p | grep net.ipv4.ip_forward 如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。 sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf sysctl -p | grep net.ipv4.ip_forward 获取基础镜像。建议使用官方提供的镜像部署推理服务。 镜像地址{image_url}为: 西南-贵阳一:swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_7.0.0-py_3.9-hce_2.0.2312-aarch64-snt9b-20240312154948-219655b docker pull {image_url} 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。 docker run -itd \ --name sdwebui \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -p 8183:8183 \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ --shm-size 60g \ --device=/dev/davinci_manager \ --device=/dev/hisi_hdc \ --device=/dev/devmm_svm \ --device=/dev/davinci3 \ --network=bridge \ ${image_name} bash 参数说明: --name ${container_name} 容器名称,进入容器时会用到,此处可以自己定义一个容器名称,例如sdxl-diffusers。 --device=/dev/davinci3:挂载主机的/dev/davinci3到容器的/dev/davinci3。可以使用npu-smi info查看空闲卡号,修改davinci后数字可以更改挂载卡。 ${image_name} 代表 ${image_name}。 进入容器。需要将${container_name}替换为实际的容器名称,例如:sdwebui。 docker exec -it ${container_name} bash
  • Step5 服务调用 在浏览器中输入http://ip:8443访问界面,页面如下图。 图3 访问界面 双击访问页面,并搜索“Ascend”,单击“AscendNode”,如下图。 图4 搜索Ascend 会得到一个新的关于NPU的checkpoint,如下图。 图5 NPU的checkpoint 根据上面checkpoint的箭头,对新的NPU的checkpoint进行规划,如下图。 图6 规划checkpoint 在ckpt_name中选择要使用的权重文件,device_id为要使用的NPU卡号,单击“Queue Prompt”加入推理队列进行推理,如下图。 图7 加入推理队列 成功之后结果如下图。 图8 推理成功 首次加载或切换模型进行推理时,需要加载模型并进行相关的初始化工作,首次推理时间较长,请耐心等待。
  • Step3 启动容器镜像 启动容器镜像。启动前请先按照参数说明修改${}中的参数。 export work_dir="自定义挂载的工作目录" export container_work_dir="自定义挂载到容器内的工作目录" export container_name="自定义容器名称" export image_name="镜像名称" // 启动一个容器去运行镜像 docker run -itd \ --device=/dev/davinci1 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /etc/ascend_install.info:/etc/ascend_install.info \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ --shm-size 32g \ --net=bridge \ -p 8443:8443 \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_name} bash 参数说明: -v ${work_dir}:${container_work_dir}:代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 ${image_name}:容器镜像的名称。 通过容器名称进入容器中。 docker exec -it ${container_name} bash
  • Step4 下载并安装软件 从github下载ComfyUI代码并安装依赖。 cd /home/ma-user git clone https://github.com/comfyanonymous/ComfyUI.git cd ComfyUI git reset --hard 831511a1eecbe271e302f2f2053f285f00614180 pip install -r requirements.txt 如果出现报错SSL certificate problem: self signed certificate in certificate chain 图1 报错SSL certificate problem 可采取忽略SSL证书验证:使用以下命令来克隆仓库,它将忽略SSL证书验证。 git clone -c http.sslVerify=false https://github.com/comfyanonymous/ComfyUI.git 此处根据ComfyUI官网描述进行配置。 下载SD模型并安装。部署好ComfyUI环境和依赖后,还需要将模型放到对应位置。 下载模型,模型下载地址:sd1.5模型地址 ,sdxl下载地址。根据自己的需要下载对应的模型,如下图,并将模型上传到容器内自定义挂载的工作目录。 图2 模型列表 将模型复制到/home/ma-user/ComfyUI/models/checkpoints目录下。 将获取到的ComfyUI插件ascendcloud-aigc-6.3.904-*.tar.gz文件上传到容器的/home/ma-user/ComfyUI/custom_nodes目录下,并解压。获取路径参见表2。 cd /home/ma-user/ComfyUI/custom_nodes/ tar -zxvf ascendcloud-aigc-6.3.904-*.tar.gz tar -zxvf ascendcloud-aigc-extensions-comfyui.tar.gz rm -rf ascendcloud-aigc-6.3.904-* ascendcloud-aigc-6.3.904-*.tar.gz后面的*表示时间戳,请按照实际替换。 使用容器IP启动服务。 cd /home/ma-user/ComfyUI python main.py --port 8443 --listen ${docker_ip} --force-fp16 ${docker_ip}替换为容器实际的IP地址。可以在宿主机上通过docker inspect容器ID |grep IPAddress命令查询。
  • Step1 准备环境 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数 如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装NPU设备和驱动,或释放被挂载的NPU。 检查docker是否安装。 docker -v #检查docker是否安装 如尚未安装,运行以下命令安装docker。 yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。 sysctl -p | grep net.ipv4.ip_forward 如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。 sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf sysctl -p | grep net.ipv4.ip_forward
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 ascendcloud-aigc-6.3.904-*.tar.gz 说明: 包名中的*表示具体的时间戳,以包名的实际时间为准。 获取路径:Support-E网站。 说明: 如果没有下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像 西南-贵阳一:swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc1-py_3.9-hce_2.0.2312-aarch64-snt9b-20240516142953-ca51f42 从SWR拉取。
  • Step2 修改训练超参配置 以Llama2-70b和Llama2-13b的LoRA微调为例,执行脚本为0_pl_lora_70b.sh和0_pl_lora_13b.sh 。 修改模型训练脚本中的超参配置,必须修改的参数如表1所示。其他超参均有默认值,可以参考表1按照实际需求修改。 表1 必须修改的训练超参配置 参数 示例值 参数说明 ORIGINAL_TRAIN_DATA_PATH /home/ma-user/ws/llm_train/AscendSpeed/training_data/finetune/alpaca_gpt4_data.json 必须修改。训练时指定的输入数据路径。请根据实际规划修改。 ORIGINAL_HF_WEIGHT /home/ma-user/ws/llm_train/AscendSpeed/model/llama2-70B 必须修改。加载tokenizer与Hugging Face权重时,对应的存放地址。请根据实际规划修改。 对于ChatGLMv3-6B和Qwen系列模型,还需要手动修改tokenizer文件,具体请参见训练tokenizer文件说明。
  • 方案概览 本文档利用训练框架Pytorch_npu+华为自研Ascend Snt9b硬件,为用户提供了开箱即用的预训练和全量微调方案。 本文档以Llama2-70B为例,同时适用于Llama2-7B、Llama2-13B。模型运行环境是ModelArts Lite的DevServer。 本方案目前配套的是AscendCloud-3rdLLM系列版本,仅适用于部分企业客户,完成本方案的部署,需要先联系您所在企业的华为方技术支持。
  • 操作流程 图1 操作流程图 表1 操作任务流程说明 阶段 任务 说明 准备工作 准备环境 本教程案例是基于ModelArts Lite DevServer运行的,需要购买并开通DevServer资源。 准备代码 准备AscendSpeed训练代码、分词器Tokenizer和推理代码。 准备数据 准备训练数据,可以用Alpaca数据集,也可以使用自己准备的数据集。 准备镜像 准备训练模型适用的容器镜像。 预训练 预训练 介绍如何进行预训练,包括训练数据处理、超参配置、训练任务、断点续训及性能查看。 微调训练 SFT全参微调 介绍如何进行SFT全参微调。 LoRA微调训练 介绍如何进行LoRA微调训练。 推理前的权重转换 - 模型训练完成后,可以将训练产生的权重文件用于推理。推理前参考本章节,将训练后生成的多个权重文件合并,并转换成Huggingface格式的权重文件。 如果无推理任务或者使用开源Huggingface权重文件进行推理,可以忽略此章节。和本文档配套的推理文档请参考《开源大模型基于DevServer的推理通用指导》。
  • Step2 查看精度测试结果 默认情况下,评测结果会按照result/{service_name}/{eval_dataset}-{timestamp} 的目录结果保存到对应的测试工程。执行多少次,则会在{service_name}下生成多少次结果。 单独的评测结果如下: {eval_dataset}-{timestamp} # 例如: mmlu-20240205093257 ├── accuracy │ ├── evaluation_accuracy.xlsx # 测试的评分结果,包含各个学科数据集的评分和总和评分。 ├── infer_info │ ├── xxx1.csv # 单个数据集的评测结果 │ ├── ...... │ ├── xxxn.csv # 单个数据集的评测结果 ├── summary_result │ ├── answer_correct.xlsx # 回答正确的结果 │ ├── answer_error.xlsx # 保存回答了问题的选项,但是回答结果错误 │ ├── answer_result_unknow.xlsx # 保存未推理出结果的问题,例如超时、系统错误 │ ├── system_error.xlsx # 保存推理结果,但是可能答非所问,无法判断是否正确,需要人工判断进行纠偏。
  • Step1 配置精度测试环境 获取精度测试代码。精度测试代码存放在代码包AscendCloud-3rdLLM-x.x.x的llm_tools/llm_evaluation目录中,代码目录结构如下。精度测试使用到的mmlu和ceval数据集已经提前打包在代码中。 benchmark_eval ├──apig_sdk # ma校验包 ├──cpu_npu # 检测资源消耗 ├── config │ ├── config.json # 服务的配置模板,已配置了ma-standard,tgi示例 │ ├── mmlu_subject_mapping.json # mmlu数据集学科信息 │ ├── ceval_subject_mapping.json # ceval数据集学科信息 ├── evaluators │ ├── evaluator.py # 数据集数据预处理方法集 │ ├── chatglm.py # 处理请求相应模块, 一般和chatglm的官方评测数据集ceval搭配 │ ├── llama.py # 处理请求相应模块, 一般和llama的评测数据集mmlu搭配 ├── mmlu-exam, mmlu数据集 ├── ceval-exam, ceval数据集 ├── eval_test.py # 启动脚本,建立线程池发送请求,并汇总结果 ├── readme.md # 说明文档 ├── requirements.txt # 第三方依赖 ├── service_predict.py # 发送请求的服务 上传精度测试代码到推理容器中。如果在Step5 进入容器安装推理依赖软件步骤中已经上传过AscendCloud-3rdLLM-x.x.x.zip并解压,无需重复执行。 进入benchmark_eval目录下,执行如下命令安装性能测试的关依赖。 pip install -r requirements.txt 执行精度测试启动脚本eval_test.py,具体操作命令如下,可以根据参数说明修改参数。 python eval_test.py \ --max_workers=1 \ --service_name=llama2-13b-chat-test \ --eval_dataset=ceval \ --service_url=http://127.0.0.1:8085/v1/completions \ --few_shot=3 \ --is_devserver=True \ --model_name=llama2 \ --deploy_method=vllm \ --vllm_model=${model_path} 参数说明: max_workers:请求的最大线程数,默认为1。 service_name:服务名称,保存评测结果时创建目录,示例为:llama2-13b-chat-test。 eval_dataset:评测使用的评测集(枚举值),目前仅支持mmlu、ceval。 service_url:成功部署推理服务后的服务预测地址,示例:http://127.0.0.1:8085/generate。此处的端口号8085来自前面配置的服务端口。 few_shot:开启少量样本测试后添加示例样本的个数。默认为3,取值范围为0~5整数。 is_devserver: 是否devserver部署方式,True表示DevServer模式。False表示ModelArts Standard模式。 model_name:评测模型名称,llama2。 deploy_method:部署方法,不同的部署方式api参数输入、输出解析方式不同,目前支持tgi、ma_standard、vllm等方式。 vllm_model:deploy_method为vllm时,服务以openai的方式启动,vllm_model为启动服务时传入的model_path。
  • Step5 修改算法脚本 进入容器后,修改启动脚本文件。 vi /home/ma-user/sdxl-train/user-job-dir/code/diffusers_finetune_train.sh 在第2行增加export MA_NUM_HOSTS=1 即可,如: #!/bin/bash export MA_NUM_HOSTS=1 if [[ $MA_NUM_HOSTS == 1 ]]; then
  • Step6 启动训练服务 执行如下命令运行训练脚本。 cd /home/ma-user/sdxl-train/user-job-dir/code sh diffusers_finetune_train.sh 训练执行脚本中配置了保存checkpoint的频率,每500steps保存一次,如果磁盘空间较小,这个值可以改大到5000,避免磁盘空间写满,导致训练失败终止。 checkpoint保存频率的修改命令如下: --checkpointing_steps=5000 训练执行成功如下图所示。 图1 训练执行成功
  • Step4 启动镜像 启动容器镜像。启动前可以根据实际需要增加修改参数。 docker run -itd --name sdxl-train -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /etc/localtime:/etc/localtime -v /usr/local/Ascend/driver:/usr/local/Ascend/driver -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi --shm-size 60g --device=/dev/davinci_manager --device=/dev/hisi_hdc --device=/dev/devmm_svm --device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 --device=/dev/davinci3 --device=/dev/davinci4 --device=/dev/davinci5 --device=/dev/davinci6 --device=/dev/davinci7 --security-opt seccomp=unconfined --network=bridge sdxl-train:0.0.1 bash 参数说明: --device=/dev/davinci0,..., --device=/dev/davinci7:挂载NPU设备,示例中挂载了8张卡davinci0~davinci7。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。 进入容器。默认使用ma-user用户,后续所有操作步骤都在ma-user用户下执行。 docker exec -it sdxl-train bash
  • Step3 构建镜像 基于官方提供的基础镜像构建自定义镜像sdxl-train:0.0.1。参考如下命令编写Dockerfile文件。镜像地址{image_url}请参见表2。 FROM {image_url} RUN mkdir /home/ma-user/sdxl-train && mkdir /home/ma-user/sdxl-train/user-job-dir && mkdir /home/ma-user/sdxl-train/user-job-dir/code COPY --chown=ma-user:ma-group diffusers_finetune_train.sh /home/ma-user/sdxl-train/user-job-dir/code/diffusers_finetune_train.sh COPY --chown=ma-user:ma-group train_text_to_image_sdxl-0212.py /home/ma-user/sdxl-train/user-job-dir/code/train_text_to_image_sdxl-0212.py COPY --chown=ma-user:ma-group config.yaml /home/ma-user/sdxl-train/user-job-dir/code/config.yaml COPY --chown=ma-user:ma-group stable-diffusion-xl-base-1.0 /home/ma-user/sdxl-train/stable-diffusion-xl-base-1.0 COPY --chown=ma-user:ma-group vae-fp16-fix /home/ma-user/sdxl-train/vae-fp16-fix COPY --chown=ma-user:ma-group datasets /home/ma-user/sdxl-train/datasets RUN pip install accelerate datasets transformers diffusers RUN source /etc/bashrc && pip install deepspeed COPY --chown=ma-user:ma-group attention_processor.py /home/ma-user/anaconda3/envs/PyTorch-2.1.0/lib/python3.9/site-packages/diffusers/models/attention_processor.py
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 AscendCloud-3rdAIGC-6.3.905-xxx.zip 文件名中的xxx表示具体的时间戳,以包名发布的实际时间为准。 获取路径:Support-E 如果没有软件下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像包 swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc2-py_3.9-hce_2.0.2312-aarch64-snt9b-20240528150158-b521cc0 SWR上拉取
  • Step2 下载代码包、依赖模型包和数据集 下载stable-diffusion-xl-base-1.0模型包并上传到宿主机上,官网下载地址:https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main 下载vae-fp16-fix模型包并上传到宿主机上,官网下载地址:https://huggingface.co/madebyollin/sdxl-vae-fp16-fix/tree/main 下载开源数据集并上传到宿主机上,官网下载地址:https://huggingface.co/datasets/lambdalabs/pokemon-blip-captions/tree/main。用户也可以使用自己的数据集。 下载SDXL插件代码包AscendCloud-3rdAIGC-6.3.905-xxx.zip文件,获取路径参见获取软件和镜像。本案例使用的是AscendCloud-3rdAIGC-6.3.905-xxx.zip文件中的ascendcloud-aigc-poc-sdxl-finetune.tar.gz代码包。解压后上传到宿主机上。 依赖的插件代码包、模型包和数据集存放在宿主机上的本地目录结构如下,供参考。 [root@devserver-ei-cto-office-ae06cae7-tmp1216 docker_build]# ll total 192 -rw------- 1 root root 108286 May 6 16:56 attention_processor.py -rw------- 1 root root 430 May 8 09:31 config.yaml drwx------ 3 root root 4096 May 7 10:50 datasets -rw------- 1 root root 1356 May 8 16:30 diffusers_finetune_train.sh -rw------- 1 root root 1468 May 8 16:49 Dockerfile #需要用户参考Step3构建镜像步骤写Dockerfile文件 drwx------ 10 root root 4096 Apr 30 15:18 stable-diffusion-xl-base-1.0 -rw------- 1 root root 58048 May 8 17:48 train_text_to_image_sdxl-0212.py drwx------ 2 root root 4096 Apr 30 15:17 vae-fp16-fix
共100000条