华为云用户手册

  • 单条请求性能测试 针对openai的/v1/completions以及/v1/chat/completions两个非流式接口,请求体中可以添加可选参数"return_latency",默认为false,如果指定该参数为true,则会在相应请求的返回体中返回字段"latency",返回内容如下: prefill_latency(首token时延):请求从到达服务开始到生成首token的耗时 model_prefill_latency(模型计算首token时延):服务从开始计算首token到生成首token的耗时 avg_decode_latency(平均增量token时延):服务计算增量token的平均耗时 time_in_queue(请求排队时间):请求从到达服务开始到开始被调度的耗时 request_latency(请求总时延):请求从到达服务开始到结束的耗时 以上指标单位均是ms,保留2位小数。
  • benchmark方法介绍 性能benchmark包括两部分。 静态性能测试:评估在固定输入、固定输出和固定并发下,模型的吞吐与首token延迟。该方式实现简单,能比较清楚的看出模型的性能和输入输出长度、以及并发的关系。 动态性能测试:评估在请求并发在一定范围内波动,且输入输出长度也在一定范围内变化时,模型的延迟和吞吐。该场景能模拟实际业务下动态的发送不同长度请求,能评估推理框架在实际业务中能支持的并发数。 性能benchmark验证使用到的脚本存放在代码包AscendCloud-LLM-xxx.zip的llm_tools/llm_evaluation目录下。 代码目录如下: benchmark_tools ├── benchmark_parallel.py # 评测静态性能脚本 ├── benchmark_serving.py # 评测动态性能脚本 ├── generate_dataset.py # 生成自定义数据集的脚本 ├── benchmark_utils.py # 工具函数集 ├── benchmark.py # 执行静态、动态性能评测脚本 ├── requirements.txt # 第三方依赖
  • 动态benchmark 本章节介绍如何进行动态benchmark验证。 获取数据集。动态benchmark需要使用数据集进行测试,可以使用公开数据集,例如Alpaca、ShareGPT。也可以根据业务实际情况,使用generate_datasets.py脚本生成和业务数据分布接近的数据集。 方法一:使用公开数据集 ShareGPT下载地址: https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json Alpaca下载地址: https://github.com/tatsu-lab/stanford_alpaca/blob/main/alpaca_data.json 方法二:使用generate_dataset.py脚本生成数据集方法: 客户通过业务数据,在generate_dataset.py脚本,指定输入输出长度的均值和标准差,生成一定数量的正态分布的数据。具体操作命令如下,可以根据参数说明修改参数。 cd benchmark_tools python generate_dataset.py --dataset custom_datasets.json --tokenizer /path/to/tokenizer \ --min-input 100 --max-input 3600 --avg-input 1800 --std-input 500 \ --min-output 40 --max-output 256 --avg-output 160 --std-output 30 --num-requests 1000 generate_dataset.py脚本执行参数说明如下: --dataset:数据集保存路径,如custom_datasets.json。 --tokenizer:tokenizer路径,可以是HuggingFace的权重路径。backend取值是openai时,tokenizer路径需要和推理服务启动时--model路径保持一致,比如--model /data/nfs/model/llama_7b, --tokenizer也需要为/data/nfs/model/llama_7b,两者要完全一致。 --min-input:输入tokens最小长度,可以根据实际需求设置。 --max-input:输入tokens最大长度,可以根据实际需求设置。 --avg-input:输入tokens长度平均值,可以根据实际需求设置。 --std-input:输入tokens长度方差,可以根据实际需求设置。 --min-output:最小输出tokens长度,可以根据实际需求设置。 --max-output:最大输出tokens长度,可以根据实际需求设置。 --avg-output:输出tokens长度平均值,可以根据实际需求设置。 --std-output:输出tokens长度标准差,可以根据实际需求设置。 --num-requests:输出数据集的数量,可以根据实际需求设置。 进入benchmark_tools目录下,切换一个conda环境。 cd benchmark_tools conda activate python-3.9.10 执行脚本benchmark_serving.py测试动态benchmark。具体操作命令如下,可以根据参数说明修改参数。 python benchmark_serving.py --backend vllm --host ${docker_ip} --port 8080 --dataset custom_datasets.json --dataset-type custom \ --tokenizer /path/to/tokenizer --request-rate 0.01 1 2 4 8 10 20 --num-prompts 10 1000 1000 1000 1000 1000 1000 \ --max-tokens 4096 --max-prompt-tokens 3768 --benchmark-csv benchmark_serving.csv --backend:服务类型,如tgi,vllm,mindspore、openai。 --host ${docker_ip}:服务部署的IP地址,${docker_ip}替换为宿主机实际的IP地址。 --port:推理服务端口。 --dataset:数据集路径。 --dataset-type:支持三种 "alpaca","sharegpt","custom"。custom为自定义数据集。 --tokenizer:tokenizer路径,可以是HuggingFace的权重路径,backend取值是openai时,tokenizer路径需要和推理服务启动时--model路径保持一致,比如--model /data/nfs/model/llama_7b, --tokenizer也需要为/data/nfs/model/llama_7b,两者要完全一致。 --request-rate:请求频率,支持多个,如 0.1 1 2。实际测试时,会根据request-rate为均值的指数分布来发送请求以模拟真实业务场景。 --num-prompts:某个频率下请求数,支持多个,如 10 100 100,数量需和--request-rate的数量对应。 --max-tokens:输入+输出限制的最大长度,模型启动参数--max-input-length值需要大于该值。 --max-prompt-tokens:输入限制的最大长度,推理时最大输入tokens数量,模型启动参数--max-total-tokens值需要大于该值,tokenizer建议带tokenizer.json的FastTokenizer。 --benchmark-csv:结果保存路径,如benchmark_serving.csv。 --served-model-name: 选择性添加, 选择性添加,在接口中使用的模型名;如果没有配置,则默认为tokenizer。 脚本运行完后,测试结果保存在benchmark_serving.csv中,示例如下图所示。 图2 动态benchmark测试结果(示意图)
  • Step4 准备推理环境 获取LLaVA模型代码。 cd ${container_work_dir} unzip AscendCloud-6.3.906-xxx.zip unzip AscendCloud-AIGC-6.3.906-xxx.zip cd multimodal_algorithm/LLAVA/llava-inference/5d8f1760c08b7dfba3ae97b71cbd4c6f17d12dbd bash build.sh cd LLaVA mkdir ./playground/data/eval 下载llava-v1.5-13b模型。下载地址:liuhaotian/llava-v1.5-13b at main (huggingface.co) 图1 下载llava-v1.5-13b模型
  • Step6 开始推理 进入解压后的源码包根目录。 cd ${container_work_dir}/multimodal_algorithm/LLAVA/llava-inference/5d8f1760c08b7dfba3ae97b71cbd4c6f17d12dbd/LLaVA 修改mme_8p.sh。需要将脚本里模型的路径更改为实际存放模型的路径(--model-path 模型路径),同时检查数据集路径与实际保持一致(--question-file --image-folder --answers-file)。 vim ./scripts/v1_5/eval/mme_8p.sh 运行评估脚本。启动单卡。 ASCEND_RT_VISIBLE_DEVI CES =0 bash ./scripts/v1_5/eval/mme_8p.sh 启动8卡。可支持单机八卡推理,可以减短耗时。 ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 bash ./scripts/v1_5/eval/mme_8p.sh
  • Step3 获取代码并上传 上传代码AscendCloud-AIGC-6.3.906-xxx.zip到容器的工作目录中,包获取路径请参见获取软件和镜像。 上传代码和权重到宿主机时使用的是root用户,此处需要执行如下命令统一文件属主为ma-user用户。 #统一文件属主为ma-user用户 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
  • Step1 检查环境 请参考Lite Server资源开通,购买Lite Server资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 购买Lite Server资源时如果无可选资源规格,需要联系华为云技术支持申请开通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。 SSH登录机器后,检查NPU卡状态。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数 如出现错误,可能是机器上的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
  • Step2 启动镜像 获取基础镜像。建议使用官方提供的镜像。镜像地址{image_url}参见获取软件和镜像。 docker pull {image_url} 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。 docker run -it --net=host \ --device=/dev/davinci0 \ --device=/dev/davinci1 \ --device=/dev/davinci2 \ --device=/dev/davinci3 \ --device=/dev/davinci4 \ --device=/dev/davinci5 \ --device=/dev/davinci6 \ --device=/dev/davinci7 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ --shm-size=32g \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /var/log/npu/:/usr/slog \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: device=/dev/davinci0,..., --device=/dev/davinci7:挂载NPU设备,示例中挂载了8张卡davinci0~davinci7。 ${work_dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统,work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 shm-size:共享内存大小。 ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 ${image_id}:镜像ID,通过docker images查看刚拉取的镜像ID。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。 进入容器。需要将${container_name}替换为实际的容器名称。启动容器默认使用ma-user用户,后续所有操作步骤都在ma-user用户下执行。 docker exec -it ${container_name} bash
  • FAQ 如果clip-vit-large-patch14-336模型不能自动下载。 请手动下载(openai/clip-vit-large-patch14-336 at main (huggingface.co)),并在llava-v1.5-13b模型下的config.json文件中修改mm_vision_tower参数中的模型路径。 图3 提示clip-vit-large-patch14-336模型不能自动下载
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 AscendCloud-6.3.906-xxx.zip软件包中的AscendCloud-AIGC-6.3.906-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-20240606190017-b881580 从SWR拉取。
  • 问题9:使用benchmark-tools访问推理服务返回报错 使用benchmark-tools访问推理服务时,输入输出的token和大于max_model_len,服务端返回报错Response payload is not completed,见图2。 再次设置输入输出的token和小于max_model_len访问推理服务,服务端响应200,见图3。 客户端仍返回报错Response payload is not completed,见图4。 图2 服务端返回报错Response payload is not completed 图3 服务端响应200 图4 仍返回报错Response payload is not completed 解决方法: 安装brotlipy后返回正确报错 pip install brotlipy
  • 问题3:使用llama3.1系列模型进行推理时报错 使用llama3.1系模型进行推理时报错:ValueError: 'rope_scaling' must be a dictionary with two fields, 'type' and 'factor', got {'factor': 8.0, 'low_freq_factor': 1.0, 'high_freq_factor': 4.0, 'original_max_position_embeddings': 8192, 'rope_type': 'llama3'}
  • 问题12:使用SmoothQuant做权重转换时,scale显示为nan,或推理时精度异常 涉及模型:qwen2-1.5b、qwen2-7b 解决方法:修改AscendCloud/AscendCloud-LLM/llm_tools/AutoSmoothQuant/autosmoothquant/utils/utils.py中的build_model_and_tokenizer函数,将torch_dtype类型从torch.float16改成torch.bfloat16 kwargs = {"torch_dtype": torch.bfloat16, "device_map": "auto"}
  • 问题5:使用AWQ转换llama3.1系列模型权重出现报错 使用AWQ转换llama3.1系列模型权重出现报错:ValueError: 'rope_scaling' must be a dictionary with two fields, 'type' and 'factor' 解决方法: 该问题通过将transformers升级到4.44.0,修改对应transformers中的transformers/models/llama/modeling_llama.py,在class LlamaRotaryEmbedding中的forward函数中增加self.inv_freq = self.inv_freq.npu()
  • 问题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
  • 问题8:使用benchmark-tools对GLM系列模型进行性能测试报错 使用benchmark-tools对GLM系列模型进行性能测试报错TypeError: _pad() got an unexpected keyword argument 'padding_side' 解决方法: 1、下载最新的tokenization_chatglm.py,替换原来权重里的tokenization_chatglm.py。 https://huggingface.co/THUDM/glm-4-9b-chat/blob/main/tokenization_chatglm.py https://huggingface.co/THUDM/chatglm3-6b/blob/main/tokenization_chatglm.py 或者2、修改tokenization_chatglm.py,在266行增加padding_side: str = "left",如图1所示。 图1 tokenization_chatglm.py
  • 问题13:使用SmoothQuant做权重转换时,有如下报错 涉及模型:qwen2-1.5b、qwen2-0.5b 解决方法:修改AscendCloud/AscendCloud-LLM/llm_tools/AutoSmoothQuant/autosmoothquant/examples/smoothquant_model.py中的main函数,保存模型时将safe_serialization指定为False int8_model.save_pretrained(output_path,safe_serialization=False)
  • 问题4:使用SmoothQuant进行W8A8进行模型量化时报错 使用SmoothQuant进行W8A8进行模型量化时报错:AttributeError: type object 'LlamaAttention' has no attribute '_init_rope' 解决方法:降低transformers版本到4.42 pip install transformers==4.42 --upgrade
  • 步骤三:调用 执行请求调用模型 curl -ik -H 'Content-Type: application/json' -d '{"messages":[{"role":"user","content":"请讲一个笑话"}],"model":"${model_name}","temperature":0.6,"max_tokens":1024}' -X POST http://${ip}:${port}/v1/chat/completions model_name:为要调用的模型名称,即DeepSeek-V3或DeepSeek-R1 ip:为步骤二:自动化部署中nodeIps中第一个IP port:为要访问的端口,默认1025
  • 步骤二:自动化部署 需要先安装yum和expect。 sudo apt-get install yum yum install expect 把rank_table_file.json、start.sh和权重文件放在同一目录下。其中rank_table_file.json和start.sh只需要在主节点即可。rank_table_file.json仅作为模板使用,会在start.sh脚本里自动更新,文件内容详见附录:rank_table_file.json文件和一键部署脚本start.sh。参考目录结构如下: ${mountPath} |---rank_table_file.json |---start.sh |---DeepSeekR1-w8a8 # 权重文件所在目录,每个节点都要有,且目录结构保持一致 执行部署脚本start.sh。 sh start.sh --model_name ${modelName} --mount_path ${mountPath} --maxSeqLen ${maxSeqLen} --node_ips ${nodeIps} --passwords ${nodePwds} modelName:模型权重所在文件夹名称。注意:文件夹名称需要包含R1或V3。例如:DeepSeekR1-w8a8。 mountPath:容器挂载的路径,且不能为/home,该路径下包含权重文件所在目录。即为权重文件所在目录的父目录。 maxSeqLen:输入长度+输出长度的最大值。推荐默认16384。 nodeIps:节点IP列表,使用“,“分隔。填2个节点IP地址。 nodePwds:各节点的root用户登录密码,使用“,“分隔,和上述节点要一一对应。
  • 步骤一:检查环境 SSH登录机器后,检查NPU设备检查。如果驱动版本不是24.1.0及以上,请先升级驱动和对应固件。 npu-smi info -t board -i 1 | egrep -i "software|firmware" #查看驱动和固件版本 固件包名称为“Ascend-hdk-910b-npu-firmware_版本号.run”,驱动包名称为“Ascend-hdk-910b-npu-driver_版本号_linux-aarch64.run”,商用版是权限受控,仅华为工程师和渠道用户有权限下载,下载地址请见固件驱动包下载链接。 安装固件命令如下,安装完后需要reboot重启机器。 chmod 700 *.run # 注意替换成实际的包名 ./Ascend-hdk-910b-npu-firmware_版本号.run --full reboot 安装驱动命令如下: # 注意替换成实际的包名 ./Ascend-hdk-910b-npu-driver_版本号_linux-aarch64.run --full --install-for-all 安装完成后再使用如下命令查看是否安装正确。 npu-smi info -t board -i 1 | egrep -i "software|firmware" 检查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
  • 步骤二 修改训练超参配置 以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/training_data/alpaca_gpt4_data.json 必须修改。训练时指定的输入数据路径。请根据实际规划修改。 ORIGINAL_HF_WEIGHT /home/ma-user/ws/models/llama2-13B 必须修改。加载Hugging Face权重(可与tokenizer相同文件夹)时,对应的存放地址。请根据实际规划修改。 TOKENIZER_PATH /home/ma-user/ws/tokenizers/llama2-13B 该参数为tokenizer文件的存放地址。默认与ORIGINAL_HF_WEIGHT路径相同。如果用户需要将Hugging Face权重与tokenizer文件分开存放时,则需要修改参数。 INPUT_PROCESSED_DIR /home/ma-user/ws/llm_train/processed_for_input/llama2-13b 该路径下保存“数据转换”和“权重转换”的结果。示例中,默认生成在“processed_for_input”文件夹下。如果用户需要修改,可添加并自定义该变量。 OUTPUT_SAVE_DIR /home/ma-user/ws/llm_train/saved_dir_for_output/ 该路径下统一保存生成的 CKPT、P LOG 、LOG 文件。示例中,默认统一保存在“saved_dir_for_output”文件夹下。如果用户需要修改,可添加并自定义该变量。 CKPT_SAVE_PATH /home/ma-user/ws/llm_train/saved_dir_for_output/saved_models/llama2-13b 保存训练生成的模型 CKPT 文件。示例中,默认保存在“saved_dir_for_output/saved_models”文件夹下。如果用户需要修改,可添加并自定义该变量。 LOG_SAVE_PATH /home/ma-user/ws/llm_train/saved_dir_for_output/saved_models/llama2-13b/log 保存训练过程记录的日志 LOG 文件。示例中,默认保存在“saved_models/llama2-13b/log”文件夹下。如果用户需要修改,可添加并自定义该变量。 ASCEND_PROCESS_LOG_PATH /home/ma-user/ws/llm_train/saved_dir_for_output/plog 保存训练过程中记录的程序堆栈信息日志 PLOG 文件。示例中,默认保存在“saved_dir_for_output/plog”文件夹下。如果用户需要修改,可添加并自定义该变量。 CONVERT_MG2HF TRUE 训练完成的权重文件默认不会自动转换为Hugging Face格式权重。如果需要自动转换,则在运行脚本添加变量CONVERT_MG2HF并赋值TRUE。如果用户后续不需要自动转换,则在运行脚本中必须删除CONVERT_MG2HF变量。转换的Hugging Face格式权重会保存至ORIGINAL_HF_WEIGHT的目录中。 对于Yi系列模型、ChatGLMv3-6B和Qwen系列模型,还需要手动修改训练参数和tokenizer文件,具体请参见训练tokenizer文件说明。 由于模型中LoRA微调训练存在已知的精度问题,因此不支持TP(tensor model parallel size)张量模型并行策略,推荐使用PP(pipeline model parallel size)流水线模型并行策略,具体详细参数配置如表2所示。
  • Step3 安装Docker 检查docker是否安装。 docker -v #检查docker是否安装 如尚未安装,运行以下命令安装docker。 yum install -y docker 配置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
  • 方案概览 本文档利用训练框架PyTorch_npu+华为自研Ascend Snt9B硬件,为用户提供了常见主流开源大模型在ModelArts Standard上的预训练和全量微调方案。 本方案目前仅适用于部分企业客户,完成本方案的部署,需要先联系您所在企业的华为方技术支持。 适配的CANN版本是cann_8.0.rc2,驱动版本是23.0.5。 本文档适用于仅使用OBS 对象存储服务 (Object Storage Service)作为存储的方案,OBS用于存储模型文件、训练数据、代码、日志等,提供了高可靠性的数据存储解决方案。
  • 使用SmoothQuant量化 SmoothQuant(W8A8)量化方案能降低模型显存以及需要部署的卡数。也能同时降低首token时延和增量推理时延。支持SmoothQuant(W8A8)量化的模型列表请参见表3。 本章节介绍如何使用SmoothQuant量化工具实现推理量化。 SmoothQuant量化工具使用到的脚本存放在代码包AscendCloud-LLM-x.x.x.zip的llm_tools目录下。 代码目录如下: AutoSmoothQuant #量化工具 ├── ascend_autosmoothquant_adapter # 昇腾量化使用的算子模块 ├── autosmoothquant # 量化代码 ├── build.sh # 安装量化模块的脚本 ... 具体操作如下: 配置环境。 cd llm_tools/AutoSmoothQuant/ sh build.sh 配置需要使用的NPU卡,例如:实际使用的是第1张和第2张卡,此处填写为“0,1”,以此类推。 export ASCEND_RT_VISIBLE_DEVICES=0,1 NPU卡编号可以通过命令npu-smi info查询。 执行权重转换。 cd autosmoothquant/examples/ python smoothquant_model.py --model-path /home/ma-user/llama-2-7b/ --quantize-model --generate-scale --dataset-path /data/nfs/user/val.jsonl --scale-output scales/llama2-7b.pt --model-output quantized_model/llama2-7b --per-token --per-channel 参数说明: --model-path:原始模型权重路径。 --quantize-model:体现此参数表示会生成量化模型权重。不需要生成量化模型权重时,不体现此参数 --generate-scale:体现此参数表示会生成量化系数,生成后的系数保存在--scale-output参数指定的路径下。如果有指定的量化系数,则不需此参数,直接读取--scale-input参数指定的量化系数输入路径即可。 --dataset-path:数据集路径,推荐使用:https://huggingface.co/datasets/mit-han-lab/pile-val-backup/resolve/main/val.jsonl.zst。 --scale-output:量化系数保存路径。 --scale-input:量化系数输入路径,若之前已生成过量化系数,则可指定该参数,跳过生成scale的过程。 --model-output:量化模型权重保存路径。 --smooth-strength:平滑系数,推荐先指定为0.5,后续可以根据推理效果进行调整。 --per-token:激活值量化方法,若指定则为per-token粒度量化,否则为per-tensor粒度量化。 --per-channel:权重量化方法,若指定则为per-channel粒度量化,否则为per-tensor粒度量化。 启动smoothQuant量化服务。 参考Step6 启动推理服务,启动推理服务时添加如下命令。 -q smoothquant 或者 --quantization smoothquant 父主题: 推理模型量化
  • Step1 创建训练任务 创建训练作业,并自定义名称、描述等信息。选择自定义算法,启动方式自定义,以及选择上传的镜像。 图1 创建训练作业 训练作业启动命令中输入: cd /home/ma-user/work/Qwen-VL; ln -s ${DATA}/ qwenvl_dataset; bash finetune/finetune_ds.sh; 选择用户自己的专属资源池,以及规格与节点数。 图2 选择资源池规格 新增SFS Turbo挂载配置,并选择用户创建的SFS Turbo文件系统。 云上挂载路径:输入镜像容器中的工作路径 /home/ma-user/work/data 存储位置:输入用户的“子目录挂载”路径。如果默认没有填写,则忽略。 图3 选择SFS Turbo SFS Turbo不能直接挂载到容器的工作路径 /home/ma-user/work/下,会覆盖镜像中的代码目录,导致训练失败。 作业日志选择OBS中的路径,ModelArts的训练作业的日志信息则保存该路径下。 最后,请参考查看日志和性能章节查看LoRA微调的日志和性能。了解更多ModelArts训练功能,可查看模型开发简介。
  • Step2 配置环境变量 单击“增加环境变量”,在增加的环境变量填写框中,按照表1表格中的配置进行填写。 表1 需要填写的环境变量 环境变量 示例值 参数说明 GPUS_PER_NODE 8 必须填写。根据资源规格每个节点上NPU的数量填写。 DATA /home/ma-user/work/data/training_data/qwenvl_dataset 必须修改。训练时指定的输入数据路径。 MODEL /home/ma-user/work/data/models/Qwen-VL-Chat 必须修改。训练时指定的模型权重路径。 OUTPUT /home/ma-user/work/data/output 必须修改。训练完成后指定的输出模型的路径。 LOG /home/ma-user/work/data/log 保存训练过程记录的日志LOG文件。
  • Step1 配置精度测试环境 获取精度测试代码。精度测试代码存放在代码包AscendCloud-LLM的llm_tools/llm_evaluation目录中,代码目录结构如下。目前使用的opencompass版本是0.2.6 benchmark_eval ├──opencompass.sh #运行opencompass脚本 ├──install.sh #安装opencompass脚本 ├──vllm_api.py #启动vllm api服务器 ├──vllm.py #构造vllm评测配置脚本名字 ├──vllm_ppl.py #ppl精度测试脚本 精度评测切换conda环境,确保之前启动服务为vllm接口,进入到benchmark_eval目录下,执行如下命令。 conda activate python-3.9.10 bash install.sh 在/home/ma-user/AscendCloud/AscendCloud-LLM/llm_tools/llm_evaluation/benchmark_eval目录下安装依赖。 cd opencompass #在benchmark_eval目录下 pip install -e . #下载对应依赖 cd ../human-eval #在benchmark_eval目录下 (可选,如果选择使用humaneval数据集) pip install -e . # 可选,如果选择使用humaneval数据集 (可选)如果需要在humaneval数据集上评估模型代码能力,请执行此步骤,否则忽略这一步。原因是通过opencompass使用humaneval数据集时,需要执行模型生成的代码。请仔细阅读human_eval/execution.py文件第48-57行的注释,内容参考如下。了解执行模型生成代码可能存在的风险,如果接受这些风险,请取消第58行的注释,执行下面步骤5进行评测。 # WARNING # This program exists to execute untrusted model-generated code. Although # it is highly unlikely that model-generated code will do something overtly # malicious in response to this test suite, model-generated code may act # destructively due to a lack of model capability or alignment. # Users are strongly encouraged to sandbox this evaluation suite so that it # does not perform destructive actions on their host or network. For more # information on how OpenAI sandboxes its code, see the accompanying paper. # Once you have read this disclaimer and taken appropriate precautions, # uncomment the following line and proceed at your own risk: # exec(check_program, exec_globals) #第58行 执行精度测试启动脚本opencompass.sh,具体操作命令如下,可以根据参数说明修改参数。请确保${work_dir} 已经通过export设置。 vllm_path=${vllm_path} \ host=$host \ service_port=${service_port} \ max_out_len=${max_out_len} \ batch_size=${batch_size} \ eval_datasets=${eval_datasets} \ model_name=${model_name} \ benchmark_type=${benchmark_type} \ bash -x opencompass.sh 参数说明: vllm_path:构造vllm评测配置脚本名字,默认为vllm。 host:与起服务的host保持一致,比如起服务为0.0.0.0,host设置也为0.0.0.0。 service_port:服务端口,与启动服务时的端口保持,比如8080。 max_out_len:在运行类似mmlu、ceval等判别式回答时,max_out_len建议设置小一些,比如16。在运行human_eval等生成式回答(生成式回答是对整体进行评测,少一个字符就可能会导致判断错误)时,max_out_len设置建议长一些,比如512,至少包含第一个回答的全部字段。 batch_size:输入的batch_size大小,不影响精度,只影响得到结果速度。 eval_datasets:评测数据集和评测方法,比如ceval_gen、mmlu_gen,不同数据集可以详见opencompass下面data目录。 model_name:评测模型名称,不需要与启动服务时的模型参数保持一致。 benchmark_type:作为一个保存log结果中的一个变量名,默认选eval。 参考命令: vllm_path=vllm host=0.0.0.0 service_port=8080 max_out_len=16 batch_size=2 eval_datasets=mmlu_gen model_name=llama_7b benchmark_type=eval bash -x opencompass.sh (可选)如果同时运行多个数据集,需要将不同数据集通过空格分开,加入到eval_datasets中,比如eval_datasets=ceval_gen mmlu_gen。运行命令如下所示。 cd opencompass python run.py --models vllm --datasets mmlu_gen ceval_gen --debug -w ${output_path} output_path: 要保存的结果路径。 (可选)创建新conda环境,安装vllm和opencompass。执行完之后,在 opencompass/configs/models/vllm/vllm_ppl.py 里是ppl的配置项。由于离线执行推理,消耗的显存相当庞大。其中以下参数需要根据实际来调整。 batch_size, 推理时传入的 prompts 数量,可配合后面的参数适当减少 offline,是否启动离线模型,使用 ppl 时必须为 True tp_size,使用推理的卡数 max_seq_len,推理的上下文长度,和消耗的显存直接相关,建议稍微高于prompts。其中,mmlu和ceval 建议 3200 另外,在 opencompass/opencompass/models/vllm_api.py 中,可以适当调整 gpu_memory_utilization。如果还是 oom,建议适当往下调整。 最后,如果执行报错提示oom,建议修改数据集的shot配置。例如mmlu,可以修改文件 opencompass/configs/datasets/mmlu/mmlu_ppl_ac766d.py 中的 fix_id_list, 将最大值适当调低。 ppl困惑度评测一般用于base权重测评,会将n个选项上拼接上下文,形成n个序列,再计算这n个序列的困惑度(perplexity)。其中,perplexity最小的序列所对应的选项即为这道题的推理结果。运行时间比较长,例如llama3_8b 跑完mmlu要2~3小时。 在npu卡上,使用多卡进行推理时,需要预置变量 export PYTORCH_NPU_ALLOC_CONF=expandable_segments:False 执行脚本如下: python run.py --models vllm_ppl --datasets mmlu_ppl -w ${output_path} output_path 指定保存结果的路径。 参考模型llama3系列模型,数据集mmlu为例,配置如下: 表1 参数配置 模型 max_seq_len batch_size shot数 llama3_8b 3200 8 采用默认值 llama3_70b 3200 4 [0, 1, 2] (可选) opencompass也支持通过本地权重来进行ppl精度测试。本质上使用transformers进行推理,因为没有框架的优化,执行时间最长。另一方面,由于是使用transformers推理,结果也是最稳定的。对单卡运行的模型比较友好,算力利用率比较高。对多卡运行的推理,缺少负载均衡,利用率低。 在昇腾卡上执行时,需要在 opencompass/opencompass/runners/local.py 中添加如下代码 import torch import torch_npu from torch_npu.contrib import transfer_to_npu 执行脚本如下 # for llama3_8b python run.py --datasets mmlu_ppl \ --hf-type base --hf-path {hf-path} \ --max-seq-len 3200 --max-out-len 16 --hf-num-gpus 1 --batch-size 4 \ -w {output_path} --debug 参数说明如下: --datasets:评测的数据集及评测方法,其中 mmlu 是数据集,ppl 是评测方法。 --hf-type:HuggingFace模型权重类型(base,chat), 默认为chat, 依据实际的模型选择。 --hf-path:本地 HuggingFace 权重的路径,比如/home/ma-user/nfs/model/Meta-Llama-3-8B。 --max-seq-len:模型的最大序列长度。 --max-out-len:模型的最大输出长度。 --hf-num-gpus:需要使用的卡数。 --batch-size:推理每次处理的输入数目。 -w:存放输出结果的目录。
  • Alpaca数据集 本教程使用Alpaca数据集,数据集的介绍及下载链接如下。 Alpaca数据集是由OpenAI的text-davinci-003引擎生成的包含52k条指令和演示的数据集。这些指令数据可以用来对语言模型进行指令调优,使语言模型更好地遵循指令。 预训练使用的Alpaca数据集下载:https://huggingface.co/datasets/tatsu-lab/alpaca/resolve/main/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet,数据大小:24M左右。 微调使用的Alpaca数据集下载:https://huggingface.co/datasets/QingyiSi/Alpaca-CoT/blob/main/alpacaGPT4/alpaca_gpt4_data.json,数据大小:43.6 MB。
  • 上传数据到指定目录 将下载的原始数据存放在/mnt/sfs_turbo/training_data目录下。具体步骤如下: 进入到/mnt/sfs_turbo/目录下。 创建目录“training_data”,并将原始数据放置在此处。 mkdir training_data 数据存放参考目录结构如下: ${workdir} |── training_data |── train-00000-of-00001-a09b74b3ef9c3b56.parquet # 训练原始数据集 |── alpaca_gpt4_data.json # 微调数据文件
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全