华为云用户手册

  • 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
  • 附录:大模型推理常见问题 问题1:在推理预测过程中遇到NPU out of memory 解决方法:调整推理服务启动时的显存利用率,将--gpu-memory-utilization的值调小。 问题2:在推理预测过程中遇到ValueError:User-specified max_model_len is greater than the drived max_model_len 解决方法: 修改config.json文件中的"seq_length"的值,"seq_length"需要大于等于 --max-model-len的值。 config.json存在模型对应的路径下,例如:/data/nfs/benchmark/tokenizer/chatglm3-6b/config.json 父主题: 主流开源大模型基于DevServer适配PyTorch NPU推理指导(6.3.905)
  • 查看性能 训练性能主要通过训练日志中的2个指标查看,吞吐量和loss收敛情况。 吞吐量(tokens/s/p):global batch size*seq_length/(总卡数*elapsed time per iteration)*1000,其global batch size(GBS)、seq_len(SEQ_LEN)为训练时设置的参数,具体参数查看表1。 loss收敛情况:日志里存在lm loss参数 ,lm loss参数随着训练迭代周期持续性减小,并逐渐趋于稳定平缓。也可以使用可视化工具TrainingLogParser查看loss收敛情况,如图2所示。 单节点训练:训练过程中的loss直接打印在窗口上。 多节点训练:训练过程中的loss打印在最后一个节点上。 图2 Loss收敛情况(示意图)
  • 模型软件包结构说明 本教程需要使用到的AscendCloud-3rdLLM-xxx.zip软件包中的关键文件介绍如下。 ├──llm_tools #推理工具包 ├──llm_evaluation #推理评测代码包 ├──benchmark_eval # 精度评测 ├── config ├── config.json # 请求的参数,根据实际启动的服务来调整 ├── mmlu_subject_mapping.json # 数据集配置 ├── ... ├── evaluators ├── evaluator.py # 数据集数据预处理方法集 ├── model.py # 发送请求的模块,在这里修改请求响应。目前支持vllm.openai,atb的tgi模板 ├── ... ├── eval_test.py # 启动脚本,建立线程池发送请求,并汇总结果 ├── service_predict.py # 发送请求的服务。支持vllm的openai,atb的tgi模板 ├── ... ├──benchmark_tools #性能评测 ├── benchmark.py # 可以基于默认的参数跑完静态benchmark和动态benchmark ├── benchmark_parallel.py # 评测静态性能脚本 ├── benchmark_serving.py # 评测动态性能脚本 ├── benchmark_utils.py # 抽离的工具集 ├── generate_datasets.py # 生成自定义数据集的脚本 ├── requirements.txt # 第三方依赖 ├── ... ├──llm_inference #推理代码 ├── ascend_vllm_adapter #昇腾vLLM使用的算子模块 ├── ascend.txt #基于开源vLLM适配过NPU的patch脚本 ├── autosmoothquant_ascend.txt #基于开源autosmoothquant适配过NPU的patch脚本 ├── build.sh #推理构建脚本 ├── requirements.txt # 第三方依赖
  • 支持的模型列表和权重文件 本方案支持vLLM的v0.3.2版本。不同vLLM版本支持的模型列表有差异,具体如表3所示。 表3 支持的模型列表和权重获取地址 序号 模型名称 支持vLLM v0.3.2 开源权重获取地址 1 llama-7b √ https://huggingface.co/huggyllama/llama-7b 2 llama-13b √ https://huggingface.co/huggyllama/llama-13b 3 llama-65b √ https://huggingface.co/huggyllama/llama-65b 4 llama2-7b √ https://huggingface.co/meta-llama/Llama-2-7b-chat-hf 5 llama2-13b √ https://huggingface.co/meta-llama/Llama-2-13b-chat-hf 6 llama2-70b √ https://huggingface.co/meta-llama/Llama-2-70b-hf https://huggingface.co/meta-llama/Llama-2-70b-chat-hf (推荐) 7 llama3-8b √ https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct 8 llama3-70b √ https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct 9 yi-6b √ https://huggingface.co/01-ai/Yi-6B-Chat 10 yi-9b √ https://huggingface.co/01-ai/Yi-9B 11 yi-34b √ https://huggingface.co/01-ai/Yi-34B-Chat 12 deepseek-llm-7b √ https://huggingface.co/deepseek-ai/deepseek-llm-7b-chat 13 deepseek-coder-instruct-33b √ https://huggingface.co/deepseek-ai/deepseek-coder-33b-instruct 14 deepseek-llm-67b √ https://huggingface.co/deepseek-ai/deepseek-llm-67b-chat 15 qwen-7b √ https://huggingface.co/Qwen/Qwen-7B-Chat 16 qwen-14b √ https://huggingface.co/Qwen/Qwen-14B-Chat 17 qwen-72b √ https://huggingface.co/Qwen/Qwen-72B-Chat 18 qwen1.5-0.5b √ https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat 19 qwen1.5-7b √ https://huggingface.co/Qwen/Qwen1.5-7B-Chat 20 qwen1.5-1.8b √ https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat 21 qwen1.5-14b √ https://huggingface.co/Qwen/Qwen1.5-14B-Chat 22 qwen1.5-32b √ https://huggingface.co/Qwen/Qwen1.5-32B/tree/main 23 qwen1.5-72b √ https://huggingface.co/Qwen/Qwen1.5-72B-Chat 24 qwen1.5-110b √ https://huggingface.co/Qwen/Qwen1.5-110B-Chat 25 baichuan2-7b √ https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat 26 baichuan2-13b √ https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat 27 chatglm2-6b √ https://huggingface.co/THUDM/chatglm2-6b 28 chatglm3-6b √ https://huggingface.co/THUDM/chatglm3-6b 29 gemma-2b √ https://huggingface.co/google/gemma-2b 30 gemma-7b √ https://huggingface.co/google/gemma-7b 31 mistral-7b √ https://huggingface.co/mistralai/Mistral-7B-v0.1
  • 资源规格要求 本文档中的模型运行环境是ModelArts Lite的DevServer。推荐使用“西南-贵阳一”Region上的资源和Ascend Snt9B。 如果使用DevServer资源,请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。
  • 镜像版本 本教程中用到基础镜像地址和配套版本关系如下表所示,请提前了解。 表1 基础容器镜像地址 镜像用途 镜像地址 Cann版本 基础镜像 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 cann_8.0.rc2
  • 软件配套版本 本方案支持的软件配套版本和依赖包获取地址如表2所示。 表2 软件配套版本和获取地址 软件名称 说明 下载地址 AscendCloud-3rdLLM-6.3.905-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的vLLM 0.3.2推理部署代码和推理评测代码。代码包具体说明请参见模型软件包结构说明。 获取路径:Support-E 说明: 如果没有下载权限,请联系您所在企业的华为方技术支持下载获取。 AscendCloud-OPP-6.3.905-xxx.zip 推理依赖的算子包。
  • Step4 启动训练脚本 请根据表1修改超参值后,再启动训练脚本。Llama2-70B建议为8机64卡训练。 多机启动 以Llama2-70B为例,多台机器执行训练启动命令如下。进入代码目录/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed下执行启动脚本。 #第一台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=8 NODE_RANK=0 MODEL_TYPE=70B RUN_TYPE=lora DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/alpaca_ft TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Llama2-70B MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights TRAIN_ITERS=200 MBS=2 GBS=1024 TP=8 PP=8 WORK_DIR=/home/ma-user/ws sh scripts/llama2/llama2.sh # 第二台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=8 NODE_RANK=1 MODEL_TYPE=70B RUN_TYPE=lora DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/alpaca_ft TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Llama2-70B MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights TRAIN_ITERS=200 MBS=2 GBS=1024 TP=8 PP=8 WORK_DIR=/home/ma-user/ws sh scripts/llama2/llama2.sh ... ... # 第八台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=8 NODE_RANK=7 MODEL_TYPE=70B RUN_TYPE=lora DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/alpaca_ft TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Llama2-70B MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights TRAIN_ITERS=200 MBS=2 GBS=1024 TP=8 PP=8 WORK_DIR=/home/ma-user/ws sh scripts/llama2/llama2.sh 以上命令多台机器执行时,只有${NODE_RANK}的节点ID值不同,其他参数都保持一致。 其中MASTER_ADDR、 NODE_RANK、 NODE_RANK、MODEL_TYPE 、RUN_TYPE、DATASET_PATH、TOKENIZER_PATH、MODEL_PATH为必填项。 TRAIN_ITERS、MBS、GBS、TP、PP、WORK_DIR为非必填,有默认值。 单机启动 对于Llama2-7B和Llama2-13B,操作过程与Llama2-70B相同,只需修改对应参数即可,可以选用单机启动,以Llama2-13B为例。 进入代码目录/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed下执行启动脚本。先修改以下命令中的参数,再复制执行 #非必填参数,有默认值,如需修改请根据实际要求填入以下参数。 MBS=4 \ GBS=64 \ TP=8 \ PP=1 \ TRAIN_ITERS=200 \ WORK_DIR=/home/ma-user/ws \ #必填参数 MODEL_TYPE=13B \ RUN_TYPE=lora \ DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-13B/data/finetune/alpaca_ft \ TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Llama2-13B \ MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-13B/converted_weights \ sh scripts/llama2/llama2.sh 训练完成后,请参考查看日志和性能章节查看LoRA微调训练的日志和性能。
  • Step2 LoRA微调权重转换 LoRA微调训练前,需要先把训练权重文件转换为Megatron格式。 LoRA微调训练和SFT全参微调使用的是同一个HuggingFace权重文件,转换为Megatron格式后的结果也是通用的。 如果在SFT微调任务中已经完成了HuggingFace权重转换操作,此处无需重复操作,可以直接使用SFT微调中的权重转换结果。 如果前面没有执行HuggingFace权重转换任务,可以参考SFT全参微调权重转换章节完成。
  • Step3 LoRA微调超参配置 LoRA微调训练脚本llama2.sh,存放在xxx-Ascend/llm_train/AscendSpeed/scripts/llama2/目录下。训练前,可以根据实际需要修改超参配置。 微调任务配置,操作同预训练配置类似,不同点为RUN_TYPE类型不同,以及输入输出路径的配置的不同。 表1 LoRA微调超参配置 参数 值 参数说明 DATASET_PATH /home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/alpaca_ft 必填。训练时指定的输入数据路径。一般为数据地址/处理后的数据前缀名,不加文件类型后缀。 请根据实际规划修改。 TOKENIZER_PATH /home/ma-user/ws/tokenizers/Llama2-70B 必填。加载tokenizer时,tokenizer存放地址。请根据实际规划修改。 MODEL_PATH /home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights 必填。加载的权重文件路径。Step2 LoRA微调权重转换章节中将HuggingFace格式转化为Megatron格式的权重文件。 MODEL_TYPE 70B 必填。模型加载类型,根据实际填写7B、13B或70B。 TRAIN_ITERS 200 非必填。训练迭代周期。根据实际需要修改。 MBS 2 非必填。表示流水线并行中一个micro batch所处理的样本量。在流水线并行中,为了减少气泡时间,会将一个step的数据切分成多个micro batch。 该值与TP和PP以及模型大小相关,可根据实际情况进行调整。默认值为2。取值建议如下: Llama2-7B:4 Llama2-13B:4 Llama2-70B:2 GBS 1024 非必填。表示训练中所有机器一个step所处理的样本量。影响每一次训练迭代的时长。取值默认值: Llama2-7B:64 Llama2-13B:64 Llama2-70B:1024 TP 8 非必填。表示张量并行。默认值为8,取值建议: Llama2-7B:8 Llama2-13B:8 Llama2-70B:8 PP 8 非必填。表示流水线并行。取值建议: Llama2-7B:1,一般此值与运行节点数相等 Llama2-13B:1,一般此值与运行节点数相等 Llama2-70B:大于等于4,建议值为8,一般选用几台机器训练则值为几。 RUN_TYPE lora 必填。表示训练类型,lora表示LoRA微调训练。 MASTER_ADDR xx.xx.xx.xx 多机必填,单机忽略;指定主节点IP地址,多台机器中需要指定一个节点IP为主节点IP。 一般指定第一个节点IP为主节点IP。 NNODES 8 多机必填,单机忽略;节点总数,单机写1,双机写2,8机写8。 NODE_RANK 0 多机必填,单机忽略;节点序号,当前节点ID,一般从0开始,单机默认是0。以8机训练为例,节点ID依次为(0 1 2 3 4 5 6 7);一般ID为0的节点设置为主节点IP。 WORK_DIR /home/ma-user/ws 非必填。容器的工作目录。训练的权重文件保存在此路径下。默认值为:/home/ma-user/ws。
  • Step2 LoRA微调权重转换 LoRA微调训练前,需要先把训练权重文件转换为Megatron格式。 LoRA微调训练和SFT全参微调使用的是同一个HuggingFace权重文件转换为Megatron格式后的结果也是通用的。 如果在SFT微调任务中已经完成了HuggingFace权重转换操作,如果在SFT全参微调任务中已经完成了HuggingFace权重转换操作,此处无需重复操作,可以直接使用SFT全参微调中的权重转换结果。如果前面没有执行HuggingFace权重转换任务,可以参考SFT全参微调权重转换章节完成。
  • Step3 LoRA微调超参配置 本章节介绍LoRA微调训练前的超参配置,可以根据实际需要修改。 LoRA微调训练脚本baichuan2.sh,存放在llm_train/AscendSpeed/script/baichuan2/目录下。训练前,可以根据实际需要配置超参配置。 微调任务配置,操作同预训练配置类似,不同点为RUN_TYPE类型和输入输出路径,微调还需要加载权重文件。 表1 LoRA微调超参配置 参数 示例值 参数说明 DATA_PATH /home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/data/finetune/alpaca_ft 必填。训练时指定的输入数据路径。一般为数据地址/处理后的数据前缀名,不加文件类型后缀。 请根据实际规划修改。 TOKENIZER_MODEL /home/ma-user/ws/tokenizers/BaiChuan2-13B/ 必填。加载tokenizer时,tokenizer存放地址。 请根据实际规划修改。 MODEL_TYPE 13B 必填。模型加载类型,默认为13B。 TRAIN_ITERS 1000 非必填。训练迭代周期。根据实际需要修改。默认值为1000。 MBS 1 非必填。流水线并行中一个micro batch所处理的样本量。在流水线并行中,为了减少气泡时间,会将一个step的数据切分成多个micro batch。 该值与TP和PP以及模型大小相关,可根据实际情况进行调整。 默认值1。建议值单机1,双机2。 GBS 16 非必填。默认值:16;训练中所有机器一个step所处理的样本量。影响每一次训练迭代的时长,建议值单机16,双机32。 TP 8 非必填。张量并行。默认值为8。 PP 1 非必填。表示流水线并行。建议值单机1,双机2。 RUN_TYPE lora 必填。表示训练类型。lora表示LoRA微调。 MASTER_ADDR localhost 多机必填。 单机忽略;指定主节点IP地址,多台机器中需要指定一个节点IP为主节点IP。 一般指定第一个节点IP为主节点IP。 NNODES 1 多机必填,单机忽略;,单机写1,双机写2。 NODE_RANK 0 多机必填,单机忽略;节点序号,当前节点ID,一般从0开始,单机默认是0。 CKPT_LOAD_DIR /home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/converted_weights 从 huggingface 格式转化为 magatron 格式的权重文件。 WORK_DIR /home/ma-user/ws 非必填。容器的工作目录。训练的权重文件保存在此路径下。默认值为:/home/ma-user/ws。
  • Step4 启动训练脚本 请根据表1修改超参值后,再启动训练脚本。 单机启动 以baichuan2-13b为例,单机LoRA微调启动命令如下。进入代码目录/home/ma-user/ws/6.3.904-Ascend/llm_train/AscendSpeed下执行启动脚本。 MODEL_TYPE=13B RUN_TYPE=lora DATA_PATH=/home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/data/finetune/alpaca_ft TOKENIZER_MODEL=/home/ma-user/ws/tokenizers/BaiChuan2-13B CKPT_LOAD_DIR= /home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/converted_weights TRAIN_ITERS=300 MBS=1 GBS=16 TP=8 PP=1 WORK_DIR=/home/ma-user/ws sh scripts/baichuan2/baichuan2.sh 其中 MODEL_TYPE 、RUN_TYPE、DATA_PATH、TOKENIZER_MODEL、CKPT_LOAD_DIR为必填;TRAIN_ITERS、MBS、GBS、TP、PP 为非必填,有默认值 多机启动 以baichuan2-13b为例,多台机器执行训练启动命令如下。多机启动需要在每个节点上执行,以双机为例。进入代码目录/home/ma-user/ws/6.3.904-Ascend/llm_train/AscendSpeed下执行启动脚本。 第一台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=2 NODE_RANK=0 MODEL_TYPE=13B RUN_TYPE=lora DATA_PATH=/home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/data/finetune/alpaca_ft TOKENIZER_MODEL=/home/ma-user/ws/tokenizers/BaiChuan2-13B CKPT_LOAD_DIR=/home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/converted_weights TRAIN_ITERS=300 MBS=1 GBS=16 TP=8 PP=1 WORK_DIR=/home/ma-user/ws sh scripts/baichuan2/baichuan2.sh ... ... # 第二台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=2 NODE_RANK=1 MODEL_TYPE=13B RUN_TYPE=lora DATA_PATH=/home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/data/finetune/alpaca_ft TOKENIZER_MODEL=/home/ma-user/ws/tokenizers/BaiChuan2-13B CKPT_LOAD_DIR=/home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/converted_weights TRAIN_ITERS=300 MBS=1 GBS=16 TP=8 PP=1 WORK_DIR=/home/ma-user/ws sh scripts/baichuan2/baichuan2.sh 以上命令多台机器执行时,只有${NODE_RANK}:节点ID值不同,其他参数都保持一致;其中MASTER_ADDR、NODE_RANK、MODEL_TYPE 、RUN_TYPE、DATA_PATH、TOKENIZER_MODEL、CKPT_LOAD_DIR为必填;TRAIN_ITERS、MBS、GBS、TP、PP、WORK_DIR为非必填,有默认值。 训练完成后,请参考查看日志和性能章节查看LoRA微调训练的日志和性能。
  • 微调训练和预训练的区别 微调训练是在预训练权重的基础上使用指令数据集进行的,对模型权重进行学习调整。从而针对特定任务达到预期效果。 微调训练与预训练任务的区别主要包括: 使用的数据不同,微调使用的是指令数据集,在处理数据集时需要将--handler-name 参数指定为GeneralInstructionHandler。 因数据集不同,loss计算方式不同。需要在微调训练时指定--finetune 和--is-instruction-dataset参数,微调任务的脚本里面已经自动识别添加。 启动脚本的环境变量RUN_TYPE需要指定为sft或者lora。
  • 操作流程 图1 操作流程图 表1 操作任务流程说明 阶段 任务 说明 准备工作 准备环境 购买并开通模型运行所需的资源环境。 准备代码 准备AscendSpeed代码、分词器Tokenizer和推理代码。 准备数据 准备数据,可以用Alpaca数据集,也可以使用自己准备的数据集。 准备镜像 准备模型适用的容器镜像,包括容器内资源检查 预训练 预训练 介绍如何进行预训练,包括训练数据处理、超参配置、训练任务、断点续训及性能查看。 微调训练 SFT微调训练 介绍如何进行SFT微调训练。 LoRA微调训练 介绍如何进行LoRA微调训练。 推理前的权重转换 - 模型训练完成后,可以将训练产生的权重文件用于推理。推理前参考本章节,将训练后生成的多个权重文件合并,并转换成Huggingface格式的权重文件。 如果无推理任务或者使用开源Huggingface权重文件进行推理,可以忽略此章节。和本文档配套的推理文档请参考《开源大模型基于DevServer的推理通用指导》。
  • Step3 下载原始模型 SDXL主要涉及5个模型,分别是text_encoder,text_encoder2,unet,unet2和vae_decoder。这里unet2表示refiner line下的unet模型。除了unet2,其他模型都可以从HuggingFace网站直接下载到onnx模型文件。 下载text_encoder,text_encoder2,unet和vae_decoder模型。下载地址:stable-diffusion-xl-base-1.0,下载如图2所示4个文件。 图2 下载SDXL模型 将下载的模型放到/home/ma-user/sdxl_ms/onnx的对应文件夹中,容器内外文件拷贝的命令参考如下。 docker cp model.onnx container_name:/home/ma-user/sdxl_ms/onnx/text_encoder/ 拷贝完模型文件后目录结构如下所示 /home/ma-user/sdxl_ms/onnx / |- || text_encoder |-- config.ini |-- config.json |-- model.onnx |- || text_encoder2 |-- config.ini |-- config.json |-- model.onnx |-- model.onnx_data |- || unet |-- config.ini |-- config.json |-- model.onnx |-- model.onnx_data |- || unet_2 |-- config.ini |-- config.json |- || vae_decoder |-- config.ini |-- config.json |-- model.onnx 下载unet2模型。这里unet2表示refiner line下的unet模型。下载地址:stable-diffusion-xl-refiner-1.0。这里需要把整个stable-diffusion-xl-refiner-1.0模型文件下载下来,可以在sdxl_ms下创建一个temp文件夹,将下载好的stable-diffusion-xl-refiner-1.0模型文件拷贝到temp文件夹中。 由于启动容器时默认用户为ma-user用户。如果需要切换到root用户可以执行以下命令: sudo su source /home/ma-user/.bashrc 如果继续使用ma-user,在使用其他属组如root用户上传的数据和文件时,可能会存在权限不足的问题,因此需要执行如下命令统一文件属主。 sudo chown -R ma-user:ma-group ${container_work_dir} # ${container_work_dir}:/home/ma-user/ws 容器内挂载的目录 例如: sudo chown -R ma-user:ma-group /home/ma-user/ws unet_2转换。unet2模型使用前需要先转换为onnx文件。 进入temp文件夹,将/home/ma-user/sdxl_ms/convert_xl_unet.py复制到文件夹中。 cd temp/ cp ../convert_xl_unet.py ./ 修改转换脚本convert_xl_unet.py第63行为如下内容并保存。 unet_path = "./unet.onnx" 安装依赖。 pip install transformers torch diffusers 执行转换脚本。 python convert_xl_unet.py 转换完成后在temp文件夹下有如下文件。 图3 转换后的unet2模型文件 将上图中的两个文件unet.onnx和weights.pb都复制到/home/ma-user/sdxl_ms/onnx/unet_2文件夹中,并修改unet.onnx为model.onnx,最终onnx文件夹的目录结构如下: /home/ma-user/sdxl_ms/onnx / |- || text_encoder |-- config.ini |-- config.json |-- model.onnx |- || text_encoder2 |-- config.ini |-- config.json |-- model.onnx |-- model.onnx_data |- || unet |-- config.ini |-- config.json |-- model.onnx |-- model.onnx_data |- || unet_2 |-- config.ini |-- config.json |-- model.onnx |-- weights.pb |- || vae_decoder |-- config.ini |-- config.json |-- model.onnx
  • Step5 模型推理 先在/home/ma-user/sdxl_ms下面创建outputs文件夹。 mkdir outputs 运行/home/ma-user/sdxl_ms路径下的run_txt2img_ms.py进行本地验证。 python run_txt2img_ms.py 最后会打印pipeline推理时间,并且在outputs文件夹下会生成图片。 图5 打印推理时间 图6 生成图片 也可通过在python run_txt2img_ms.py后加上相应参数进行测试,如 python run_txt2img_ms.py --height 512 --width 512 可选参数: --prompt "在这里写提示词,请用英文" --num_inference_stepsunet模型执行步数,默认50 --height图片高,默认为1024 --width图片宽,默认1024 --scheduler调度算法,默认为DDIM --seed随机种子,默认为42 安装依赖。 pip install flask 启动服务。 运行/home/ma-user/sdxl_ms路径下的infer_server.py部署推理服务。 python infer_server.py 服务启动成功显示如下。 图7 服务启动成功
  • Step2 安装模型插件代码包 将获取到的插件代码包ascendcloud-aigc-6.3.T041-*.tar.gz文件上传到容器的/home/ma-user/目录下并解压。获取路径参见获取软件和镜像。 cd /home/ma-user/ mkdir sdxl_ms cd sdxl_ms/ tar -zxvf ascendcloud-aigc-6.3.T041-*.tar.gz tar -zxvf ascendcloud-aigc-poc-sdxl_ms.tar.gz rm -rf ascendcloud-aigc-6.3.T041-* ascendcloud-aigc-6.3.T041-*.tar.gz后面的*表示时间戳,请按照实际替换。 /home/ma-user/sdxl_ms路径下的文件如下图所示。 图1 插件代码包文件
  • Step6 使用Python脚本进行测试 使用python脚本进行测试,脚本内容如下。 # coding=utf-8 import requests import base64 import os from io import BytesIO from PIL import Image def base64_to_image(base64_str): image = base64.b64decode(base64_str, altchars=None, validate=False) image = BytesIO(image) image = Image.open(image) image.save(os.path.join("./outputs","output_img.png")) if __name__ == '__main__': # Config url, token and file path url = "http://localhost:8446" # Set body,then send request headers = { 'Content-Type':'application/json' } body = { "prompt": "a tiger sleep under the tree", "height": 512, "width": 512 } resp = requests.post(url, headers=headers, json=body) # Print result #print(resp.content) base64_to_image(resp.content) 将该脚本内容编辑成test.py文件并运行,服务端会打印推理时间,并在outputs文件夹下生成对应图片,打开图片查看效果。 python test.py
  • Step4 模型转换 在进行模型转换前,需先设置环境变量。 cd /home/ma-user/sdxl_ms export LITE_HOME=/usr/local/mindspore-lite/mindspore-lite-2.3.0rc1-linux-aarch64 export LD_LIBRARY_PATH=$LITE_HOME/runtime/lib:$LITE_HOME/runtime/third_party/dnnl:$LITE_HOME/tools/converter/lib:$LD_LIBRARY_PATH export PATH=$LITE_HOME/tools/converter/converter:$LITE_HOME/tools/benchmark:$PATH 修改模型转换脚本。 模型转换的脚本是/home/ma-user/sdxl_ms/run_onnx_to_mindir.sh,脚本内容如下,请根据实际情况修改。 图4 修改模型转换脚本 这里提供的模型适配包支持5种分档位图片大小,分别是512x512 768x768 960x960 1024x1024 1280x1280 执行如下命令转换模型。 sh run_onnx_to_mindir.sh 出现CONVERT RESULT SUCCESS:0即为转模型成功,这里会自动依次转换5个模型。转换时间较长(大约35min),请耐心等待。
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 ascendcloud-aigc-6.3.T041-*.tar.gz 文件名中的*表示具体的时间戳,以包名的实际时间为准。 Support网站 请联系您所在企业的华为方技术支持下载获取。 基础镜像Beta包 mindspore_2.3.0-cann_8.0.rc1-py_3.9-euler_2.10.7-aarch64-snt9b-20240422202644-39b975b.tar.partxx
  • Step1 准备环境 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 购买DevServer资源时如果无可选资源规格,需要联系华为云技术支持申请开通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问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 获取基础镜像。建议使用官方提供的镜像部署推理服务,获取方式参见获取软件和镜像。 将获取到的基础镜像推到SWR上,再通过docker pull拉到容器中。 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。 docker run -itd \ --device=/dev/davinci1 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/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=host \ -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为用户家目录,不要将容器内/home目录替换掉。 --name ${container_name} 容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 --device=/dev/davinci1:1为卡号,具体使用哪张卡视情况而定,选择空闲卡号即可。卡是否空闲可在创建容器后进入容器执行npu-smi info命令查看。 进入容器。需要将${container_name}替换为实际的容器名称。 docker exec -it ${container_name} bash
  • 功能介绍 ModelArts CLI,即ModelArts命令行工具,是一个跨平台命令行工具,用于连接ModelArts服务并在ModelArts资源上执行管理命令。用户可以使用交互式命令行提示符或脚本通过终端执行命令。为了方便理解,下面将ModelArts CLI统称为ma-cli。ma-cli支持用户在ModelArts Notebook及线下虚拟机中与云端服务交互,使用ma-cli命令可以实现命令自动补全、鉴权、镜像构建、提交ModelArts训练作业、提交DLI Spark作业、OBS数据复制等。
  • 命令说明 表1 ma-cli支持的命令 命令 命令详情 configure ma-cli鉴权命令,支持用户名密码、AK/SK image ModelArts镜像构建、镜像注册、查询已注册镜像信息等 obs-copy 本地和OBS文件/文件夹间的相互复制 ma-job ModelArts训练作业管理,包含作业提交、资源查询等 dli-job DLI Spark任务提交及资源管理 auto-completion 命令自动补全
  • 命令预览 $ ma-cli -h Usage: ma-cli [OPTIONS] COMMAND [ARGS]... Options: -V, -v, --version 1.2.1 -C, --config-file TEXT Configure file path for authorization. -D, --debug Debug Mode. Shows full stack trace when error occurs. -P, --profile TEXT CLI connection profile to use. The default profile is "DEFAULT". -h, -H, --help Show this message and exit. Commands: configure Configures authentication and endpoints info for the CLI. image Support get registered image list、register or unregister image、debug image, build image in Notebook. obs-copy Copy file or directory between OBS and local path. ma-job ModelArts job submission and query job details. dli-job DLI spark job submission and query job details. auto-completion Auto complete ma-cli command in terminal, support "bash(default)/zsh/fish".
  • 从JupyterLab中下载大于100MB的文件到本地 大于100MB的文件需要先从Notebook中上传到OBS,再从OBS下载到本地,具体操作如下: 在Notebook中,新建一个大于100MB的“ipynb”文件,使用MoXing先将该文件从Notebook上传到OBS中,示例代码如下: 1 2 import moxing as mox mox.file.copy('/home/ma-user/work/obs_file.txt', 'obs://bucket_name/obs_file.txt') 其中“/home/ma-user/work/obs_file.txt”为文件在Notebook中的存储路径,“obs://bucket_name/obs_file.txt”为该文件上传到OBS的存储路径,其中“bucket_name”为OBS中创建的桶的名称,“obs_file.txt”为上传的文件。 使用OBS或ModelArts SDK将OBS中的文件下载到本地。 方式一:使用OBS进行下载 在OBS中,可以将样例中的“obs_file.txt”下载到本地。如果您的数据较多,推荐OBS Browser+下载数据或文件夹。使用OBS下载文件的操作指导参见下载文件 方式二:使用ModelArts SDK进行下载 在您的本地环境下载并安装ModelArts SDK。 完成ModelArts SDK的Session鉴权。 将OBS中的文件下载到本地,详请参见从OBS下载数据。示例代码如下: 1 2 3 4 5 6 7 8 9 10 from modelarts.session import Session # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 __AK = os.environ["HUAWEICLOUD_SDK_AK"] __SK = os.environ["HUAWEICLOUD_SDK_SK"] # 如果进行了加密还需要进行解密操作 session = Session(access_key=__AK,secret_key=__SK, project_id='***', region_name='***') session.download_data(bucket_path="/bucket_name/obs_file.txt",path="/home/user/obs_file.txt")
  • ma-cli dli-job提交DLI Spark作业支持的命令 $ma-cli dli-job -h Usage: ma-cli dli-job [OPTIONS] COMMAND [ARGS]... DLI spark job submission and query jod details. Options: -h, -H, --help Show this message and exit. Commands: get-job Get DLI spark job details. get-log Get DLI spark log details. get-queue Get DLI spark queues info. get-resource Get DLI resources info. stop Stop DLI spark job by job id. submit Submit dli spark batch job. upload Upload local file or OBS object to DLI resources. 表1 提交DLI Spark作业命令总览 命令 命令详情 get-job 查询DLI Spark作业列表及详情。 get-log 查询DLI Spark运行日志。 get-queue 查询DLI 队列。 get-resource 查询DLI 分组资源。 stop 停止DLI Spark作业。 submit 提交DLI Spark作业。 upload 上传本地文件或OBS文件到DLI分组资源。 父主题: 使用ma-cli dli-job命令提交DLI Spark作业
  • 背景信息 Notebook使用涉及到计费,具体收费项如下: 处于“运行中”状态的Notebook,会消耗资源,产生费用。根据您选择的资源不同,收费标准不同,价格详情请参见产品价格详情。当您不需要使用Notebook时,建议停止Notebook,避免产生不必要的费用。 创建Notebook时,如果选择使用云硬盘EVS存储配置,云硬盘EVS会一直收费,建议及时停止并删除Notebook,避免产品不必要的费用。 在创建Notebook时,默认会开启自动停止功能,在指定时间内停止运行Notebook,避免资源浪费。 只有处于“运行中”状态的Notebook,才可以执行打开、停止操作。 一个账户最多创建10个Notebook。
  • 示例代码 创建训练作业 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 from modelarts.session import Session from modelarts.estimator import Estimator session = Session() estimator = Estimator( modelarts_session=session, framework_type='PyTorch', # AI引擎名称 framework_version='PyTorch-1.0.0-python3.6', # AI引擎版本 code_dir='/obs-bucket-name/src/', # 训练脚本目录 boot_file='/obs-bucket-name/src/pytorch_sentiment.py', # 训练启动脚本目录 log_url='/obs-bucket-name/log/', # 训练日志目录 hyperparameters=[ {"label":"classes", "value": "10"}, {"label":"lr", "value": "0.001"} ], output_path='/obs-bucket-name/output/', # 训练输出目录 train_instance_type='modelarts.vm.xxx.xxx', # 训练环境规格 train_instance_count=1, # 训练节点个数 job_description='pytorch-sentiment with ModelArts SDK') # 训练作业描述 job_instance = estimator.fit(inputs='/obs-bucket-name/data/train/', wait=False, job_name='my_training_job') 查询模型列表 1 2 3 4 from modelarts.session import Session from modelarts.model import Model session = Session() model_list_resp = Model.get_model_list(session, model_status="published", model_name="digit", order="desc") 查询服务详情 1 2 3 4 5 from modelarts.session import Session from modelarts.model import Predictor session = Session() predictor_instance = Predictor(session, service_id="input your service_id") predictor_info_resp = predictor_instance.get_service_info()
共100000条