1 拉取镜像

官方镜像地址:mindie

注:根据设备型号选择对应版本

2 创建容器

docker run -itd -u root \
--ipc=host \
--network=host \
--privileged \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-v /var/log/npu/:/usr/slog \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
-v /usr/local/sbin:/usr/local/sbin \
-v /etc/hccn.conf:/etc/hccn.conf \
-v /weight:/weight \
--name mindie2.1.RC1 \
swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.1.RC1-800I-A2-py311-openeuler24.03-lts \
/bin/bash

部分参数说明:-v /data0/weight:/weight 容器内外权重路径映射

**注意:**若因为服务器重启或其他原因导致容器被关闭可用docker start mindie2.1.RC1启动容器

3 单机模型服务化部署

3.1 进入容器

[root@localhost ~]# docker exec -it mindie2.1.RC1 bash

3.2 修改服务参数

[root@localhost /]# cd /usr/local/Ascend/mindie/latest/mindie-service/
[root@localhost mindie-service]# vim conf/config.json

配置参数说明-MindIE2.1.RC1-昇腾社区

主要修改参数:

ipAddress:服务IP

port:服务端口

httpsEnabled:是否开启HTTPS通信安全认证,改为false

npuDeviceIds:表示启用哪几张NPU卡

modelName:模型名称

modelWeightPath:模型权重路径

worldSize:启用几张卡推理(与npuDeviceIds对应)

maxSeqLen:最大长度(大于maxInputTokenLen+maxIterTimes)

maxInputTokenLen:最大输入长度

maxPrefillTokens:必须大于或等于maxInputTokenLen的取值。

maxIterTimes:最大输出长度

3.3 拉起服务

./bin/mindieservice_daemon
# 后台方式
# nohup ./bin/mindieservice_daemon > mindieservice_output.log 2>&1 &

3.4 关闭服务

[root@localhost mindie-service]# pkill -9 mindie

3.5 退出容器

[root@localhost mindie-service]# exit

4 多机服务化部署

所有节点都需要创建容器进行配置

4.1 检查机器网络情况

# 检查物理链接
for i in {0..7}; do hccn_tool -i $i -lldp -g | grep Ifname; done 
# 检查链接情况
for i in {0..7}; do hccn_tool -i $i -link -g ; done
# 检查网络健康情况
for i in {0..7}; do hccn_tool -i $i -net_health -g ; done
# 查看侦测ip的配置是否正确
for i in {0..7}; do hccn_tool -i $i -netdetect -g ; done
# 查看网关是否配置正确
for i in {0..7}; do hccn_tool -i $i -gateway -g ; done
# 检查NPU底层tls校验行为一致性,建议全0
for i in {0..7}; do hccn_tool -i $i -tls -g ; done | grep switch
# NPU底层tls校验行为置0操作
for i in {0..7};do hccn_tool -i $i -tls -s enable 0;done

4.2 配置rank_table_file.json

获取每张卡的ip地址

for i in {0..7};do hccn_tool -i $i -ip -g; done

参考如下格式,配置rank_table_file.json(server_list中第一个server为主节点,所有机器都要配置这个文件

cd /weight
vim rank_table_file.json

{
    "version": "1.0",
    "server_count": "2", # 服务器数量
    "server_list": [
        {
            "server_id": "x.x.x.x", # 节点的ip地址
            "container_ip": "x.x.x.x", # 容器ip地址(服务化部署时需要),若无特殊配置,则与server_id相同
            "device": [
                {
                    "device_id": "0", # 当前卡的本机编号,取值范围[0, 本机卡数)
                    "device_ip": "x.x.x.x", # 当前卡的ip地址,可通过hccn_tool命令获取
                    "rank_id": "0" # 当前卡的全局编号,取值范围[0, 总卡数)
                },
                ...
                {
                    "device_id": "7",
                    "device_ip": "x.x.x.x",
                    "rank_id": "7"
                }
            ]
        },
        ...
        
        {
            "server_id": "x.x.x.x",
            "container_ip": "x.x.x.x",
            "device": [
                {
                    "device_id": "0",
                    "device_ip": "x.x.x.x",
                    "rank_id": "8"
                },
                ...
                {
                    "device_id": "7",
                    "device_ip": "x.x.x.x",
                    "rank_id": "15"
                }
            ]
        }
    ],
    "status": "completed"
}

4.3 配置环境变量

所有机器都要配置

vim ~/.bashrc

# 开启通信环境变量
export ATB_LLM_HCCL_ENABLE=1
export ATB_LLM_COMM_BACKEND="hccl"
export HCCL_CONNECT_TIMEOUT=7200

export HCCL_EXEC_TIMEOUT=0
# 虚拟内存
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
# 归约类通信算子的确定性计算,一般情况下无需开启,开启确定性计算后,算子执行时间会变慢,导致性能下降。
export HCCL_DETERMINISTIC=false
# 容器ip地址,每台不一样
export MIES_CONTAINER_IP=x.x.x.x  
export RANK_TABLE_FILE=/weight/rank_table_file.json 
# 该环境变量用于配置通信算法的编排展开位置
# export HCCL_OP_EXPANSION_MODE=AIV
unset HCCL_OP_EXPANSION_MODE
# 解决权重加载过慢问题
export OMP_NUM_THREADS=1
# 设置显存比
export NPU_MEMORY_FRACTION=0.96
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7

source ~/.bashrc

4.4 修改服务化参数

[root@localhost /]# cd /usr/local/Ascend/mindie/latest/mindie-service/
[root@localhost mindie-service]# vim conf/config.json

配置参数说明-MindIE2.1.RC1-昇腾社区

主要修改参数:

ipAddress:服务IP # 主节点写主节点的ip,其余节点用默认的

port:服务端口 # 主节点写主节点的ip,其余节点用默认的

httpsEnabled:是否开启HTTPS通信安全认证,改为false

interCommTLSEnabled:集群内部实例间的通信是否启用TLS,改为false

npuDeviceIds:表示启用哪几张NPU卡,多机推理场景下该值无效

multiNodesInferEnabled:改为true,开启多机推理

interNodeTLSEnabled:多机推理时,跨机通信是否开启证书安全认证,改为false

modelName:模型名称

modelWeightPath:模型权重路径

worldSize:启用几张卡推理(与npuDeviceIds对应),多机推理场景下该值无效

maxSeqLen:最大长度(大于maxInputTokenLen+maxIterTimes)

maxInputTokenLen:最大输入长度

maxPrefillTokens:必须大于或等于maxInputTokenLen的取值。

maxIterTimes:最大输出长度

4.5 拉起服务

所有节点同时执行

./bin/mindieservice_daemon
# 后台方式
# nohup ./bin/mindieservice_daemon > mindieservice_output.log 2>&1 &

执行命令后所有节点都出现以下输出:

Daemon start success!

则认为服务成功启动。

mindie接口测试

推理接口-MindIE2.1.RC1-昇腾社区

语言模型

curl -H "Accept: application/json" -H "Content-type: application/json"  -X POST -d '{
    "model": {modelName},
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "你好"
        }
    ],
    "max_tokens": 2048,
    "seed": null,
    "temperature": 0.5,
    "top_p": 0.95,
    "stream": false
}' http://{ipAddress}:{port}/v1/chat/completions

多模态模型

curl -H "Accept: application/json" -H "Content-type: application/json"  -X POST -d '{
    "model": {modelName},
    "messages": [{
        "role": "user",
        "content": [
           {"type": "text", "text": "描述这张图片"},
           {"type": "image_url", "image_url": "/xxxx/test.png"}
        ]
    }],
    "max_tokens": 2048,
    "seed": null,
    "temperature": 0.5,
    "top_p": 0.95,
    "stream": false
}' http://{ipAddress}:{port}/v1/chat/completions
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐