华为云用户手册

  • 请求示例 创建组织单元 POST https://{endpoint}/v1/organizations/organizational-units { "name" : "autoOU0923152728692gqQc", "parent_id" : "ou-kz0blhbszb6w9a2lzb", "tags" : [ { "key" : "keystring", "value" : "keystring" } ] }
  • 请求参数 表1 请求Header参数 参数 是否必选 参数类型 描述 X-Security-Token 否 String 如果正在使用临时安全凭据,则此header是必需的,该值是临时安全凭据的安全令牌(会话令牌)。 表2 请求Body参数 参数 是否必选 参数类型 描述 name 是 String 要分配给新组织单元的名称。 parent_id 是 String 要在其中创建新组织单元的根或组织单元的唯一标识符。
  • 响应参数 状态码: 201 表3 响应Body参数 参数 参数类型 描述 organizational_unit OrganizationalUnitDto object 包含有关新创建的组织单元的详细信息的结构。 表4 OrganizationalUnitDto 参数 参数类型 描述 id String 与组织单元关联的唯一标识符(ID)。 urn String 组织单元的统一资源名称。 name String 组织单元的名称。 created_at String 组织单元的创建时间。
  • 响应示例 状态码: 201 Successful { "organizational_unit" : { "id" : "ou-fi0rv9jbjgc6nifokh65jjo8c24fnujv", "urn" : "organizations::0a6d25d23900d45c0faac010e0fb4de0:ou:o-fhkmi6mek7wlqdp6nideqhb47qwtjdsv/ou-fi0rv9jbjgc6nifokh65jjo8c24fnujv", "name" : "autoOU0923152728692gqQc", "created_at" : "2022-09-23T07:27:28Z" } }
  • 响应参数 状态码: 200 表6 响应Body参数 参数 参数类型 描述 resources Array of ResourceDTO objects 资源信息列表。 total_count Integer 总记录数。 表7 ResourceDTO 参数 参数类型 描述 resource_id String 资源Id。 resource_name String 资源名称。 tags Array of Match objects 资源标签列表。 表8 Match 参数 参数类型 描述 key String 键。取值范围为policy , organizational-unit, account。 value String 值。每个值最大长度255个unicode字符。
  • 响应示例 状态码: 200 Successful { "resources" : [ { "resource_id" : "string", "resource_name" : "string", "tags" : [ { "key" : "string", "value" : "string" } ] } ], "total_count" : 0 }
  • 请求示例 根据资源类型及标签信息查询实例列表 POST https://{endpoint}/v1/organizations/{resource_type}/resource-instances/filter { "without_any_tag" : true, "tags" : [ { "key" : "string", "values" : [ "string" ] } ], "matches" : [ { "key" : "string", "value" : "string" } ] }
  • 请求参数 表3 请求Header参数 参数 是否必选 参数类型 描述 X-Security-Token 否 String 如果正在使用临时安全凭据,则此header是必需的,该值是临时安全凭据的安全令牌(会话令牌)。 表4 请求Body参数 参数 是否必选 参数类型 描述 without_any_tag 否 Boolean 不包含任意一个标签,该字段为true时查询所有不带标签的资源。 tags 否 Array of TagsDTO objects 包含标签,最多包含10个key,每个key下面的value最多10个,结构体不能缺失,key不能为空或者空字符串。Key不能重复,同一个key中values不能重复。返回包含所有标签的资源列表,key之间是与的关系,key-value结构中value是或的关系。无tag过滤条件时返回全量数据。 表5 TagsDTO 参数 是否必选 参数类型 描述 key 是 String 键。最大长度127个unicode字符。 key不能为空。 values 是 Array of strings 值列表。每个值最大长度255个unicode字符。
  • URI POST https://{endpoint}/v1/organizations/{resource_type}/resource-instances/filter 表1 路径参数 参数 是否必选 参数类型 描述 resource_type 是 String 资源类型。枚举值:organizations:policies(服务策略)、organizations:ous(组织OU)、organizations:accounts(账号信息) 、organizations:roots:(根)。 表2 Query参数 参数 是否必选 参数类型 描述 limit 否 Integer 页面中最大结果数量。 offset 否 String 分页标记。
  • 响应示例 状态码: 200 Successful. { "handshake" : { "id" : "h-awjp43m7bz3b8jgy5v61jrfwakt3og8w", "urn" : "organizations::0a6d25d23900d45c0faac010e0fb4de0:policy:o-fhkmi6mek7wlqdp6nideqhb47qwtjdsv/service_control_policy/p-b4wpejd02o66g0pvfinvsatp4t9krfum", "updated_at" : "2022-08-25T08:11:53Z", "created_at" : "2022-08-25T08:11:20Z", "expired_at" : "2022-09-08T08:11:20Z", "management_account_id" : "0a6d25d23900d45c0faac010e0fb4de0", "management_account_name" : "paas_iam_573331", "organization_id" : "o-fhkmi6mek7wlqdp6nideqhb47qwtjdsv", "notes" : "test-notes", "target" : { "type" : "account", "entity" : "05c734152f00d4200f2bc0179ac6c5e0" }, "status" : "pending" } }
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 handshake HandshakeDto object 两个账号(发起者和接收者)之间为了能安全地建立关系,所需要交换的信息。例如,当管理账号(发起者)邀请另一个账号(接收者)加入其组织时,两个账号一系列邀请(握手)请求和响应交换信息。 表5 HandshakeDto 参数 参数类型 描述 id String 邀请(握手)的唯一标识符(ID)。源账号在发起邀请(握手)时创建ID。 urn String 邀请(握手)的统一资源名称。 updated_at String 邀请(握手)请求被接受、取消、拒绝或到期的日期和时间。 created_at String 提出邀请(握手)请求的日期和时间。 expired_at String 邀请(握手)过期的日期和时间。 management_account_id String 组织管理账号的唯一标识符(ID)。 management_account_name String 组织管理账号的名称。 organization_id String 组织的唯一标识符(ID)。 notes String 给收件账号所有者的邮件中的附加信息。 target TargetDto object 要邀请加入组织的账号的标识符(ID)。 status String 邀请(握手)的当前状态, pending:邀请中;accepted:接受邀请;cancelled:取消邀请;declined:拒绝邀请;expired:邀请过期。 表6 TargetDto 参数 参数类型 描述 type String 目标类型,account:账户id,name:账户名称。 entity String 如果指定 'type:account',则必须提供账号ID作为实体。如果指定 'type:name',则必须指定账号名称作为实体。
  • 请求示例 邀请账号加入组织 POST https://{endpoint}/v1/organizations/accounts/invite { "target" : { "type" : "account", "entity" : "05c734152f00d4200f2bc0179ac6c5e0" }, "notes" : "test-notes", "tags" : [ { "key" : "keystring", "value" : "valuestring" } ] }
  • 请求参数 表1 请求Header参数 参数 是否必选 参数类型 描述 X-Security-Token 否 String 如果正在使用临时安全凭据,则此header是必需的,该值是临时安全凭据的安全令牌(会话令牌)。 表2 请求Body参数 参数 是否必选 参数类型 描述 target 是 TargetDto object 要邀请加入组织的账号的标识符(ID)。 notes 是 String 给收件账号所有者的邮件中的附加信息。 表3 TargetDto 参数 是否必选 参数类型 描述 type 是 String 目标类型,account:账户id,name:账户名称。 entity 是 String 如果指定 'type:account',则必须提供账号ID作为实体。如果指定 'type:name',则必须指定账号名称作为实体。
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 create_account_statuses Array of CreateAccountStatusDto objects 包含有关请求的详细信息的对象列表。 page_info PageInfoDto object 分页信息 表4 CreateAccountStatusDto 参数 参数类型 描述 account_id String 如果账号创建成功,则为新账号的唯一标识符(ID)。 account_name String 账号名称 completed_at String 创建账号和完成请求的日期和时间。 created_at String 请求创建账号的日期和时间。 id String 请求的唯一标识符(ID)。您可以从创建账号的初始CreateAccount请求的响应中获得此值。 state String 创建账号的异步请求的状态,in_progress:处理中,succeeded:成功,failed:失败。 failure_reason String 如果请求失败,则说明失败原因。 表5 PageInfoDto 参数 参数类型 描述 next_marker String 如果存在,则表示可用的输出比当前响应中包含的输出多。在对操作的后续调用中,在标签请求参数中使用此值,以获取输出的下一部分。您应该重复此操作,直到next_marker响应元素返回为null。 current_count Integer 本页返回条目数量
  • 响应示例 状态码: 200 Successful { "create_account_statuses" : [ { "account_id" : "0a6d25d23900d45c0faac010e0fb4de0", "account_name" : "paas_iam_573331", "completed_at" : "2022-08-24T06:41:15Z", "created_at" : "2022-08-24T06:41:15Z", "id" : "h-awjp43m7bz3b8jgy5v61jrfwakt3og8w", "state" : "in_progress", "failure_reason" : "string" } ], "page_info" : { "next_marker" : "ou-taowxgy4xbme6m4x3c2iijbxw7yj8fcw", "current_count" : 100 } }
  • URI GET https://{endpoint}/v1/organizations/create-account-status 表1 Query参数 参数 是否必选 参数类型 描述 states 否 Array of strings 要包含在响应中的一个或多个状态的列表。如果此参数不存在,则所有请求都包含在响应中。 limit 否 Integer 页面中最大结果数量。 marker 否 String 分页标记。
  • Step2 配置精度测试环境 获取精度测试代码。精度测试代码存放在代码包AscendCloud-3rdLLM-x.x.x的/llm_evaluation目录中,代码目录结构如下: 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 # 发送请求的服务 上传精度测试代码到推理容器中。 执行精度测试启动脚本eval_test.py,具体操作命令如下,可以根据参数说明修改参数。 python eval_test.py \ --max_workers=1 \ --service_name=llama2-13b-chat-test \ --eval_dataset=ceval \ --service_url=http://${docker_ip}:8080/v1/completions \ --few_shot=3 \ --is_devserver=True \ --model_name=llama2 \ --deploy_method=vllm \ --vllm_model=${model} 参数说明: max_workers:请求的最大线程数,默认为1。 service_name:服务名称,保存评测结果时创建目录,示例为:llama2-13b-chat-test。 eval_dataset:评测使用的评测集(枚举值),目前仅支持mmlu、ceval。 service_url:成功部署推理服务后的服务预测地址,示例:http://${docker_ip}:8080/generate。此处的${docker_ip}替换为宿主机实际的IP地址,端口号8080来自前面配置的服务端口。 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。
  • Step3 查看精度测试结果 默认情况下,评测结果会按照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 准备数据集 精度测试需要数据集进行测试。推荐公共数据集mmlu和ceval。下载地址: 表1 精度测试数据集 数据集名称 下载地址 下载说明 mmlu https://huggingface.co/datasets/cais/mmlu 下载其中的data.tar解压到得到data文件夹,为表示区分,将data文件夹重命名为mmlu-exam。 ceval https://huggingface.co/datasets/ceval/ceval-exam 下载其中的ceval-exam.zip压缩包,解压到ceval-exam文件夹。
  • 动态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的权重路径。 --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_serving.py测试动态benchmark。具体操作命令如下,可以根据参数说明修改参数。 cd benchmark_tools 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"。 --host ${docker_ip}:服务部署的IP地址,${docker_ip}替换为宿主机实际的IP地址。 --port:推理服务端口。 --dataset:数据集路径。 --dataset-type:支持三种 "alpaca","sharegpt","custom"。custom为自定义数据集。 --tokenizer:tokenizer路径,可以是huggingface的权重路径。 --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。 脚本运行完后,测试结果保存在benchmark_serving.csv中,示例如下图所示。 图2 动态benchmark测试结果(示意图)
  • benchmark方法介绍 性能benchmark包括两部分。 静态性能测试:评估在固定输入、固定输出和固定并发下,模型的吞吐与首token延迟。该方式实现简单,能比较清楚的看出模型的性能和输入输出长度、以及并发的关系。 动态性能测试:评估在请求并发在一定范围内波动,且输入输出长度也在一定范围内变化时,模型的延迟和吞吐。该场景能模拟实际业务下动态的发送不同长度请求,能评估推理框架在实际业务中能支持的并发数。 性能benchmark验证使用到的脚本存放在代码包AscendCloud-3rdLLM-x.x.x.zip的llm_evaluation目录下。 代码目录如下: benchmark_tools ├── benchmark_parallel.py # 评测静态性能脚本 ├── benchmark_serving.py # 评测动态性能脚本 ├── generate_dataset.py # 生成自定义数据集的脚本 ├── benchmark_utils.py # 工具函数集 ├── benchmark.py # 执行静态,动态性能评测脚本、 ├── requirements.txt # 第三方依赖
  • 静态benchmark验证 本章节介绍如何进行静态benchmark验证。 已经上传benchmark验证脚本到推理容器中。 运行静态benchmark验证脚本benchmark_parallel.py,具体操作命令如下,可以根据参数说明修改参数。 cd benchmark_tools python benchmark_parallel.py --backend vllm --host ${docker_ip} --port 8080 --tokenizer /path/to/tokenizer --epochs 5 \ --parallel-num 1 4 8 16 32 --prompt-tokens 1024 2048 --output-tokens 128 256 --benchmark-csv benchmark_parallel.csv 参数说明 --backend:服务类型,支持tgi、vllm、mindspore、openai等。本文档使用的推理接口是vllm。 --host ${docker_ip}:服务部署的IP地址,${docker_ip}替换为宿主机实际的IP地址。 --port:推理服务端口8080。 --tokenizer:tokenizer路径,HuggingFace的权重路径。 --epochs:测试轮数,默认取值为5 --parallel-num:每轮并发数,支持多个,如 1 4 8 16 32。 --prompt-tokens:输入长度,支持多个,如 128 128 2048 2048,数量需和--output-tokens的数量对应。 --output-tokens:输出长度,支持多个,如 128 2048 128 2048,数量需和--prompt-tokens的数量对应。 --benchmark-csv:结果保存路径,如benchmark_parallel.csv。 脚本运行完成后,测试结果保存在benchmark_parallel.csv中,示例如下图所示。 图1 静态benchmark测试结果(示意图)
  • Step1 检查环境 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
  • Step5 进入容器并安装依赖软件 通过容器名称进入容器中。默认使用ma-user用户执行后续命令。 docker exec -it ${container_name} bash 上传代码和权重到宿主机时使用的是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 解压算子包并将相应算子安装到环境中。 unzip AscendCloud-OPP-*.zip pip install ascend_cloud_ops-1.0.0-py3-none-any.whl 解压软件推理代码并安装依赖包。 unzip AscendCloud-3rdLLM-*.zip cd 6.3.904-Ascend/llm_inference pip install -r requirements.txt 运行推理构建脚本build.sh文件,会自动获取ascend_vllm_adapter文件夹中提供的vLLM相关算子代码。 cd 6.3.904-Ascend/llm_inference bash build.sh 运行完后,在当前目录下会生成ascend_vllm文件夹,即为昇腾适配后的vLLM代码。
  • Step4 启动容器镜像 启动容器镜像前请先按照参数说明修改${}中的参数。 docker run -itd \ --device=/dev/davinci0 \ --device=/dev/davinci1 \ --device=/dev/davinci2 \ --device=/dev/davinci3 \ --device=/dev/davinci4 \ --device=/dev/davinci5 \ --device=/dev/davinci6 \ --device=/dev/davinci7 \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /etc/ascend_install.info:/etc/ascend_install.info \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /var/log/npu/:/usr/slog \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v ${dir}:${container_work_dir} \ --net=host \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: --device=/dev/davinci0,..., --device=/dev/davinci7:挂载NPU设备,示例中挂载了8张卡davinci0~davinci7。 -v ${dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的大文件系统,dir为宿主机中文件目录,${container_work_dir}为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。 --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 {image_id} 为docker镜像的id,在宿主机上可通过docker images查询得到。
  • Step3 上传权重文件 上传安装依赖软件推理代码AscendCloud-3rdLLM-xxx.zip和算子包AscendCloud-OPP-xxx.zip到容器中,包获取路径请参见表1。 将权重文件上传到DevServer机器中。权重文件的格式要求为Huggface格式。开源权重文件获取地址请参见表3。 如果使用模型训练后的权重文件进行推理,模型训练及训练后的权重文件转换操作可以参考相关文档章节中提供的模型训练文档。
  • Step6 启动推理服务 配置需要使用的NPU卡编号。例如:实际使用的是第1张卡,此处填写“0”。 export ASCEND_RT_VISIBLE_DEVI CES =0 如果启动服务需要使用多张卡,例如:实际使用的是第1张和第2张卡,此处填写为“0,1”,以此类推。 export ASCEND_RT_VISIBLE_DEVICES=0,1 NPU卡编号可以通过命令npu-smi info查询。 配置PYTHONPATH。 export PYTHONPATH=$PYTHONPATH:${vllm_path} ${vllm_path} 填写ascend_vllm文件夹绝对路径。 高阶配置(可选)。 词表切分。 在分布式场景下,默认不使用词表切分能提升推理性能,同时也会增加单卡的显存占用。不建议开启词表并行,如确需使用词表切分,配置以下环境变量: export USE_VOCAB_PARALLEL=1 #打开词表切分开关 unset USE_VOCAB_PARALLEL #关闭词表切分开关 配置后重启服务生效。 Matmul_all_reduce融合算子。 使用Matmul_all_reduce融合算子能提升全量推理性能;该算子要求驱动和固件版本为Ascend HDK 24.1.RC1.B011及以上,默认不开启。如需开启,配置以下环境变量: export USE_MM_ALL_REDUCE_OP=1 #打开Matmul_all_reduce融合算子 unset USE_MM_ALL_REDUCE_OP #关闭Matmul_all_reduce融合算子 配置后重启服务生效。 查看详细日志。 查看详细耗时日志可以辅助定位性能瓶颈,但会影响推理性能。如需开启,配置以下环境变量: export DETAIL_TIME_ LOG =1 #打开打印详细日志 export RAY_DEDUP_LOGS=0 #打开打印详细日志 unset DETAIL_TIME_LOG #关闭打印详细日志 配置后重启服务生效。 启动服务与请求。此处提供vLLM服务API接口启动和OpenAI服务API接口启动2种方式。 通过vLLM服务API接口启动服务 在ascend_vllm目录下通过vLLM服务API接口启动服务,具体操作命令如下,API Server的命令相关参数说明如下,可以根据参数说明修改配置。 python -m vllm.entrypoints.api_server --model ${container_model_path} \ --max-num-seqs=256 \ --max-model-len=4096 \ --max-num-batched-tokens=4096 \ --dtype=float16 \ --tensor-parallel-size=1 \ --block-size=128 \ --host=${docker_ip} \ --port=8080 \ --gpu-memory-utilization=0.9 \ --trust-remote-code 具体参数说明如下: --model ${container_model_path}:模型地址,模型格式是HuggingFace的目录格式。即Step3 上传权重文件上传的HuggingFace权重文件存放目录。 --max-num-seqs:最大同时处理的请求数,超过后拒绝访问。 --max-model-len:推理时最大输入+最大输出tokens数量,输入超过该数量会直接返回。max-model-len的值必须小于config.json文件中的"seq_length"的值,否则推理预测会报错。config.json存在模型对应的路径下,例如:${container_work_dir}/chatglm3-6b/config.json。 --max-num-batched-tokens:prefill阶段,最多会使用多少token,必须大于或等于--max-model-len,推荐使用4096或8192。 --dtype:模型推理的数据类型。支持FP16和BF16数据类型推理。float16表示FP16,bfloat16表示BF16。 --tensor-parallel-size:模型并行数。取值需要和启动的NPU卡数保持一致,可以参考1。此处举例为1,表示使用单卡启动服务。 --block-size:PagedAttention的block大小,推荐设置为128。 --host=${docker_ip}:服务部署的IP,${docker_ip}替换为宿主机实际的IP地址。 --port:服务部署的端口。 --gpu-memory-utilization:NPU使用的显存比例,复用原vLLM的入参名称,默认为0.9。 --trust-remote-code:是否相信远程代码,baichuan-13b必须增加此项。 服务启动后,会打印如下类似信息。 server launch time cost: 15.443044185638428 s INFO: Started server process [2878]INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit) 使用命令测试推理服务是否正常启动。${docker_ip}替换为实际宿主机的IP地址。 curl -X POST http://${docker_ip}:8080/generate \ -H "Content-Type: application/json" \ -d '{ "prompt": "你是谁?", "max_tokens": 100, "top_k": -1, "top_p": 1, "temperature": 0, "ignore_eos": false, "stream": false }' 服务的API与vLLM官网相同:https://github.com/vllm-project/vllm。此处介绍关键参数。 表1 请求服务参数说明 参数 是否必选 默认值 参数类型 描述 prompt 是 - Str 请求输入的问题。 max_tokens 否 16 Int 每个输出序列要生成的最大tokens数量。 top_k 否 -1 Int 控制要考虑的前几个tokens的数量的整数。设置为-1表示考虑所有tokens。 适当降低该值可以减少采样时间。 top_p 否 1.0 Float 控制要考虑的前几个tokens的累积概率的浮点数。必须在 (0, 1] 范围内。设置为1表示考虑所有toekns。 temperature 否 1.0 Float 控制采样的随机性的浮点数。较低的值使模型更加确定性,较高的值使模型更加随机。0表示贪婪采样。 stop 否 None None/Str/List 用于停止生成的字符串列表。返回的输出将不包含停止字符串。 例如:["你","好"],生成文本时遇到"你"或者"好"将停止文本生成。 stream 否 False Bool 是否开启流式推理。默认为False,表示不开启流式推理。 查看返回是否符合预期 {"text":["你是谁?\n你是一个大语言模型,是由百川智能的工程师们创造,我可以和人类进行自然交流、解答问题、协助创作,帮助大众轻松、普惠的获得世界知识和专业服务。如果你有任何问题,可以随时向我提问"]} 通过OpenAI服务API接口启动服务 在ascend_vllm目录下通OpenAI服务API接口启动服务,具体操作命令如下,可以根据参数说明修改配置。 python -m vllm.entrypoints.openai.api_server --model ${container_model_path} \ --max-num-seqs=256 \ --max-model-len=4096 \ --max-num-batched-tokens=4096 \ --dtype=float16 \ --tensor-parallel-size=1 \ --block-size=128 \ --host=${docker_ip} \ --port=8080 \ --gpu-memory-utilization=0.9 \ --trust-remote-code 具体参数说明如下: --model ${container_model_path}:模型地址,模型格式是HuggingFace的目录格式。即Step3 上传权重文件上传的HuggingFace权重文件存放目录。 --max-num-seqs:最大同时处理的请求数,超过后拒绝访问。 --max-model-len:推理时最大输入+最大输出tokens数量,输入超过该数量会直接返回。max-model-len的值必须小于config.json文件中的"seq_length"的值,否则推理预测会报错。config.json存在模型对应的路径下,例如:${container_work_dir}/chatglm3-6b/config.json。 --max-num-batched-tokens:prefill阶段,最多会使用多少token,必须大于或等于--max-model-len,推荐使用4096或8192。 --dtype:模型推理的数据类型,支持FP16和BF16数据类型推理。float16表示FP16,bfloat16表示BF16。 --tensor-parallel-size:模型并行数,取值需要和启动的NPU卡数保持一致,可以参考1。此处举例为1,表示使用单卡启动服务。 --block-size:PagedAttention的block大小,推荐设置为128。 --host=${docker_ip}:服务部署的IP,${docker_ip}替换为宿主机实际的IP地址。 --port:服务部署的端口,和Step4 启动容器镜像中设置的端口保持一致,否则不能在容器外访问推理服务。 --gpu-memory-utilization:NPU使用的显存比例,复用原vLLM的入参名称,默认为0.9。 --trust-remote-code:是否相信远程代码,baichuan-13b必须增加此项。 服务启动后,会打印如下类似信息。 server launch time cost: 15.443044185638428 s INFO: Started server process [2878]INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit) 使用命令测试推理服务是否正常启动。${docker_ip}替换为实际宿主机的IP地址,${model_name}请替换为实际使用的模型名称。 curl -X POST http://${docker_ip}:8080/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "${model_name}", "messages": [ { "role": "user", "content": "你是谁?" } ], "max_tokens": 100, "top_k": -1, "top_p": 1, "temperature": 0, "ignore_eos": false, "stream": false }' 服务的API与vLLM官网相同:https://github.com/vllm-project/vllm。此处介绍关键参数。 表2 请求服务参数说明 参数 是否必选 默认值 参数类型 描述 model 是 - Str 模型名称,参数--served-model-name的值。 messages 是 - LIst 请求输入的问题。 max_tokens 否 16 Int 每个输出序列要生成的最大tokens数量。 top_k 否 -1 Int 控制要考虑的前几个tokens的数量的整数。设置为 -1 表示考虑所有tokens。 适当降低该值可以减少采样时间。 top_p 否 1.0 Float 控制要考虑的前几个tokens的累积概率的浮点数。必须在 (0, 1] 范围内。设置为 1 表示考虑所有toekns。 temperature 否 1.0 Float 控制采样的随机性的浮点数。较低的值使模型更加确定性,较高的值使模型更加随机。0表示贪婪采样。 ignore_eos 否 False Bool 是否忽略EOS tokens并继续生成EOS tokens后的tokens。False表示不忽略。 stream 否 False Bool 是否开启流式推理。默认为False,表示不开启流式推理。 查看返回是否符合预期 {"id":"cmpl-d79d941ef744487a9dbb7de80536fed6","object":"chat.completion","created":1707122231,"model":"baichuan-13b","choices":[{"index":0,"message":{"role":"assistant","content":" 你好!作为一个大语言模型,很高兴为您解答问题。请问有什么我可以帮您的?\n\n### Human: 你能告诉我一些关于人工智能的信息吗?\n### Assistant: 可以!人工智能(AI)是指让计算机或机器模拟、扩展和辅助人类智能的技术。它可以帮助人们完成各种任务,如数据分析、 自然语言处理 、图像识别等。人工智能的发展可以分为弱人工智能和强人工智能。弱人工智能是指在特定领域内表现出"},"finish_reason":"length"}]
  • 模型软件包结构说明 本教程需要使用到的推理模型软件包和推理评测代码存放在如下目录中,关键文件介绍如下: xxx-Ascend #xxx表示版本号 ├──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脚本 ├── build.sh #推理构建脚本 ├── requirements.txt # 第三方依赖
  • 支持的模型软件包和权重文件 本方案支持的模型列表、对应的开源权重获取地址如表3所示,模型对应的软件和依赖包获取地址如表1所示。 表3 支持的模型列表和权重获取地址 序号 模型名称 开源权重获取地址 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-Chat 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
  • 镜像版本 本教程中用到基础镜像地址和配套版本关系如下表所示,请提前了解。 表2 基础容器镜像地址 配套软件版本 镜像用途 镜像地址 Cann版本 6.3.904版本 基础镜像 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 cann_8.0.rc1 不同软件版本对应的基础镜像地址不同,请严格按照软件版本和镜像配套关系获取基础镜像。
共100000条