跳到主要内容
Linux OpenEuler 部署 Qwen3-32B 大模型华为昇腾 Arm 服务器 MindIE Docker Dify 方案 | 极客日志
Python AI 算法
Linux OpenEuler 部署 Qwen3-32B 大模型华为昇腾 Arm 服务器 MindIE Docker Dify 方案 在 OpenEuler 系统上配置 Anaconda 虚拟环境,通过 ModelScope 下载 Qwen3-32B 模型权重至指定硬盘。使用华为 MindIE 推理引擎构建 Docker 容器,映射 NPU 设备与模型路径。修改配置文件启动服务,并通过 Dify 平台搭建可视化交互前端,实现本地大模型的 API 调用与对话测试。
1951018925 发布于 2026/4/8 更新于 2026/5/22 19 浏览1. 基础环境配置
1.1 Anaconda 安装
系统:openEuler 22.03 (CentOS)
架构:aarch64
Anaconda 对应安装资源包下载地址:
https://repo.anaconda.com/archive/
下载好后 cd 到安装包路径,使用安装指令如下:
bash Anaconda3-2025.06-1-Linux-aarch64.sh
按照提示接受协议,并选择安装目录。安装完成后,更新环境变量:
source ~/.bashrc
1.2 Anaconda 中创建虚拟环境
这部分同 Windows 下的 Anaconda env 设置相同。
对于 Qwen3 模型的下载,配置 ModelScope 环境,代码如下:
conda create -n modelscope python=3.9
conda activate modelscope
安装 ModelScope:
pip install modelscope -i https://mirrors.aliyun.com/pypi/simple/
2. 下载模型库和模型权重
2.1 下载模型权重
如需下载完整模型库:
modelscope download --model Qwen/Qwen3-32B
如果只需要下载部分文件(例如 README):
modelscope download --model Qwen/Qwen3-32B README.md --local_dir ./dir
这种方法会把权重默认下载在路径 ~/.cache/modelscope/ 下,但是很有可能占用系统盘,影响系统使用,因此把权重下载到指定硬盘,步骤如下。
(1)搜索系统所有硬盘
lsblk -o NAME,SIZE,MOUNTPOINT
输出如下,分别代表了硬盘名字、内存和地址:
NAME SIZE MOUNTPOINT
sda 200G
├─sda1 50G /
├─sda2 150G /data
sdb 500G /mnt/disk1
sdc 1T /mnt/disk2
(2)把模型权重下载到指定的 sdc 盘中的 models 文件夹中
自己新建一个文件夹命名 models,需要定位到指定文件夹路径,不要直接下到盘的路径,否则可能还是无法下载到指定盘中!或者直接 cd 到需要下载位置的路径下在进行下载也可以!
modelscope download --model Qwen/Qwen3-32B --local_dir /mnt/disk2/models
下载完成后,模型权重会放在 /mnt/disk2/models/Qwen/Qwen3-32B/ 路径下。
删除之前默认下载地址的模型权重,以防占用系统内存:
全盘搜索 Qwen3-32B 的储存路径:
find / - d -name 2>/dev/null
sudo
type
"Qwen3-32B"
会输出包含该模型名字的目录路径,假如为 /root/dir
2.2 下载华为适配的加速推理引擎 MindIE 下载模型适配的推理引擎 MindIE,在 terminal 中输入以下命令行(魔乐社区镜像下载),即开始下载适配本模型 Qwen3-32B 的镜像包 mindie:2.0.T17.B010-800I-A2-py3.11-openeuler24.03-lts-aarch64.tar.gz(也可以进入华为社区下载)。
注意:后续部署大模型时发现上述版本的 mindie 太老了,服务挂不起来,会一直报错 LLMInferEngine failed to init LLMInferModels Killed。一般提示如下问题且不报其他错误,log 日志中也不提示其他问题报错记录的话,一般都是 mindie 镜像的原因。报错后重新在 docker 中 pull 下镜像地址即可!因此需要下载新版本的 mindie 安装包后,后续即可正常使用。
选择所需镜像,点击'立即下载'(1.0.0 及以后版本支持 DeepSeekR1 蒸馏模型)。
我们使用的华为服务器是基于 arm 架构,因此用以下命令下载即可:
docker pull --platform=arm64 swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.1.RC2-800I-A2-py311-openeuler24.03-lts
3. Docker 镜像加载
3.1 配置 Docker 环境 环境:华为 arm 架构服务器
版本:openEuler 22.03
先禁用/移除导致失败的第三方 repo(之前添加过 docker-ce 的镜像仓库),避免影响其他相关下载和更新,如果之前没有配置好 DNS 直接用 repo 不禁用的话,后续重新配置 docker 也可能会有各种报错!因此优先推荐先禁用!
sudo dnf config-manager --set-disabled docker-ce-stable || true
sudo rm -f /etc/yum.repos.d/docker-ce* || true
(1)更新下相关的 dnf 下载包
(2)确认目前系统版本 cat /etc/openEuler-release
若输出类似 openEuler release 22.03 LTS 的信息,则符合安装条件。
(3)卸载旧版本 docker,避免版本冲突 yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
(4)配置 DNS,保证网络和下载 按 i 进入编辑模式,添加以下 DNS 服务器地址:
nameserver 114.114.114.114
nameserver 8.8.8.8
注意:/etc/resolv.conf 可能被 NetworkManager 自动覆盖,若后续网络异常,可通过网卡配置文件永久设置 DNS,步骤如下:
编辑网卡文件(如/etc/sysconfig/network-scripts/ifcfg-eth0),添加:
DNS1=114.114.114.114
DNS2=8.8.8.8
保存后重启网络:systemctl restart network
(5)配置 docker 仓库 repo 新建并编辑 docker 仓库 repo 配置文件:
vi /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name =Docker CE Stable - $basearch
baseurl =https://repo.huaweicloud.com/docker-ce/linux/centos/7 /$basearch /stable
enabled =1
gpgcheck =1
gpgkey =https://repo.huaweicloud.com/docker-ce/linux/centos/gpg
(6)安装 docker 组件 yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
❗ 常见问题:若安装时提示 container-selinux 依赖缺失,先执行以下命令安装依赖:
yum install -y container-selinux
(7)启动 docker 并验证状态
注意:systemctl 设置好 docker 之后千万千万不要再随意动 systemctl 命令了!!比如 systemctl stop docker 之类的!!强制 stop 后可能引发系统问题无法直接通过 systemctl restart docker!!设置好之后就基本不要再用 systemctl 指令操作 docker 了!
错误描述:
本来想停正在运行 qwen3 的 docker 的,手贱错误输入了 systemctl stop docker,然后悲剧来了,无论是 sudo systemctl restart docker/sudo systemctl start docker 都不可以,system status docker 一直显示 failed。。。
解决方案:临时清空 Docker 配置文件
有时 Docker 的配置文件 /etc/docker/daemon.json 中的错误配置会导致启动失败。可以将该配置文件恢复到默认值(空配置),然后尝试重新启动 Docker。命令如下:
sudo echo '{}' > /etc/docker/daemon.json
sudo systemctl restart docker
(8)docker 镜像加速优化 vi /etc/docker/daemon.json
{
"registry-mirrors" : [
"https://hub-mirror.c.163.com" ,
"https://mirror.baidubce.com" ,
"https://ccr.ccs.tencentyun.com" ,
"https://docker.1panelproxy.com" ,
"https://5e96702d4787418295070cded678a7b6.mirror.swr.myhuaweicloud.com" ,
"https://docker.m.daocloud.io"
]
}
systemctl daemon-reload
systemctl restart docker
(9)docker 相关的启动/查询/删除等 查看所有已经配置好的 docker(包括运行和停止状态):
docker stop qwen3-32b
docker rm qwen3-32b
docker rm -f qwen3-32b
stop docker 后,如需运行 docker,需要重新启动后才可以继续使用 docker exec -it contain_name bash 进入容器:
3.2 启动容器 首先查询 docker 中的 mindie 镜像:
红框中圈出的是新版本的 mindie 镜像,在下面的 docker 启动中需要用到。
docker run -it -d --shm-size 200g --net=host --name qwen3-32b \
--privileged \
--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 \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/sbin:/usr/local/sbin \
-v /path/to/model:/path/to/model/in/container \
a4708118cd12 /bin/bash
chown -R root:root /path-to-weights
chmod -R 750 /path-to-weights
--user:如果您的环境中 HDK 是通过普通用户安装(如默认的 HwHiAiUser),请设置对应的用户组,例如用户组 ID 为 1001,则使用 --user mindieuser:1001;镜像中默认使用的是用户组 1000。
设置容器名称 --name 与镜像名称,例如 800I A2 服务器使用 mindie:2.0.T17.B010-800I-A2-py3.11-openeuler24.03-lts-aarch64。
3.3 进入容器 docker exec -it qwen3-32b bash
vim /usr/local/Ascend/mindie/latest/mindie-service/conf/config.json
ipAddress: 'XX.XX.XX.XX' 主机 IP
port: XXXX 端口号,自定义。不要使用 ss -tuln 中正在使用监听的端口
httpsEnabled: false 关闭 HTTPS 通信
npuDeviceIds: [[0,1,2,3...]] NPU 编号,与容器设置保持一致,想要调哪几张 npu 跑就写入其编号
worldSize: 4 NPU 数量,由 npuDeviceIds 决定
modelName: 'qwen3-32b' 模型名称,自定义。调用模型时即使用此名称
modelWeightPath: '/path/to/model/in/container' 容器内模型映射路径,与 docker run 设置保持一致
maxSeqLen: XXXX 输入和输出的最大总长度,需大于等于 maxInputTokenLen 和 maxIterTimes 的和
maxInputTokenLen: XXXX 输入部分的最大 token 数量,必须小于 maxSeqLen,如果输入被截断,可能需要增加这个参数的值
maxPrefillBatchSize: XXXX 预填充阶段一个 batch 中的请求个数上限,范围在 [1,maxBatchSize] 之间,建议设置为 maxBatchSize 的一半
maxPrefillTokens: XXXX 预填充阶段一个 batch 中包含的 Input token 总数的上限,设置为与 maxInputTokenLen 相同
maxBatchSize: XXXX 解码阶段的最大 batch size,影响并发能力,取值范围 [1,5000]
maxIterTimes: XXXX 最大迭代次数,即输出的最大 token 数,必须小于 maxSeqLen
{
"Version" : "1.0.0" ,
"ServerConfig" : {
"ipAddress" : "172.16.23.55" ,
"managementIpAddress" : "127.0.0.2" ,
"port" : 1025 ,
"managementPort" : 1026 ,
"metricsPort" : 1027 ,
"allowAllZeroIpListening" : false ,
"maxLinkNum" : 1000 ,
"httpsEnabled" : false ,
"fullTextEnabled" : false ,
"tlsCaPath" : "security/ca/" ,
"tlsCaFile" : [ "ca.pem" ] ,
"tlsCert" : "security/certs/server.pem" ,
"tlsPk" : "security/keys/server.key.pem" ,
"tlsPkPwd" : "security/pass/key_pwd.txt" ,
"tlsCrlPath" : "security/certs/" ,
"tlsCrlFiles" : [ "server_crl.pem" ] ,
"managementTlsCaFile" : [ "management_ca.pem" ] ,
"managementTlsCert" : "security/certs/management/server.pem" ,
"managementTlsPk" : "security/keys/management/server.key.pem" ,
"managementTlsPkPwd" : "security/pass/management/key_pwd.txt" ,
"managementTlsCrlPath" : "security/management/certs/" ,
"managementTlsCrlFiles" : [ "server_crl.pem" ] ,
"kmcKsfMaster" : "tools/pmt/master/ksfa" ,
"kmcKsfStandby" : "tools/pmt/standby/ksfb" ,
"inferMode" : "standard" ,
"interCommTLSEnabled" : true ,
"interCommPort" : 1121 ,
"interCommTlsCaPath" : "security/grpc/ca/" ,
"interCommTlsCaFiles" : [ "ca.pem" ] ,
"interCommTlsCert" : "security/grpc/certs/server.pem" ,
"interCommPk" : "security/grpc/keys/server.key.pem" ,
"interCommPkPwd" : "security/grpc/pass/key_pwd.txt" ,
"interCommTlsCrlPath" : "security/grpc/certs/" ,
"interCommTlsCrlFiles" : [ "server_crl.pem" ] ,
"openAiSupport" : "vllm" ,
"tokenTimeout" : 600 ,
"e2eTimeout" : 600 ,
"distDPServerEnabled" : false
} ,
"BackendConfig" : {
"backendName" : "mindieservice_llm_engine" ,
"modelInstanceNumber" : 1 ,
"npuDeviceIds" : [ [ 0 , 1 , 2 , 3 ] ] ,
"tokenizerProcessNumber" : 8 ,
"multiNodesInferEnabled" : false ,
"multiNodesInferPort" : 1120 ,
"interNodeTLSEnabled" : true ,
"interNodeTlsCaPath" : "security/grpc/ca/" ,
"interNodeTlsCaFiles" : [ "ca.pem" ] ,
"interNodeTlsCert" : "security/grpc/certs/server.pem" ,
"interNodeTlsPk" : "security/grpc/keys/server.key.pem" ,
"interNodeTlsPkPwd" : "security/grpc/pass/mindie_server_key_pwd.txt" ,
"interNodeTlsCrlPath" : "security/grpc/certs/" ,
"interNodeTlsCrlFiles" : [ "server_crl.pem" ] ,
"interNodeKmcKsfMaster" : "tools/pmt/master/ksfa" ,
"interNodeKmcKsfStandby" : "tools/pmt/standby/ksfb" ,
"ModelDeployConfig" : {
"maxSeqLen" : 25600 ,
"maxInputTokenLen" : 20480 ,
"truncation" : false ,
"ModelConfig" : [
{
"modelInstanceType" : "Standard" ,
"modelName" : "qwen3_32b" ,
"modelWeightPath" : "/data/Qwen3" ,
"worldSize" : 4 ,
"cpuMemSize" : 5 ,
"npuMemSize" : -1 ,
"backendType" : "atb" ,
"trustRemoteCode" : false
}
]
} ,
"ScheduleConfig" : {
"templateType" : "Standard" ,
"templateName" : "Standard_LLM" ,
"cacheBlockSize" : 128 ,
"maxPrefillBatchSize" : 50 ,
"maxPrefillTokens" : 25600 ,
"prefillTimeMsPerReq" : 150 ,
"prefillPolicyType" : 0 ,
"decodeTimeMsPerReq" : 50 ,
"decodePolicyType" : 0 ,
"maxBatchSize" : 200 ,
"maxIterTimes" : 10240 ,
"maxPreemptCount" : 0 ,
"supportSelectBatch" : false ,
"maxQueueDelayMicroseconds" : 5000
}
}
}
3.4 检查资源可用性(可省略) (1) 检查 HDK
(2) 检查 torch
(3) 检查 mindle 组件
3.5 服务化推理 - 模型测试 cd /usr/local/Ascend/mindie/latest/mindie-service/bin
./mindieservice_daemon
curl -X POST 172.16.23.55:1060/v1/chat/completions \
-d '{ "messages": [ {"role": "system", "content": "you are a helpful assistant."}, {"role": "user", "content": "帮我写一个上海富婆爱上我的故事"} ], "max_tokens": 256, "stream": false, "do_sample": true, "temperature": 0.6, "top_p": 0.95, "top_k": 20, "model": "qwen3-32b" }'
3.6 可视化交互前端界面
(1)使用 Dify 工具包 简介:Dify 是一款开源的大语言模型(LLM)应用开发平台,通过低代码/无代码的模块化设计降低生成式 AI 应用的开发门槛,支持集成 OpenAI、Claude3 等主流模型及自托管模型(如 Ollama)。其核心功能包括后端即服务(BaaS)、可视化 Prompt 编排和 LLMOps 工具链,可灵活构建智能客服、文本生成等场景。平台内置 RAG 引擎实现知识库检索增强生成,并通过 Agent 框架支持复杂任务分解与工具调用(如搜索、绘图),结合 Workflow 工作流实现多步骤业务逻辑自动化。
(2)Dify 安装 RAM 输出:
total used free shared buff/cache available
Mem: 7.7Gi 1.6Gi 3.3Gi 160Mi 2.8Gi 5.3Gi
Swap: 2.0Gi 0B 2.0Gi
在 Mem 行,查看 total 字段的值。确保总内存大于或等于 4 GiB。
git clone https://github.com/langgenius/dify.git --branch 0.15.3
cd dify/docker
cp .env.example .env
vim .env
将 NGINX_PORT 与 NGINX_PORT_EXPOSE 更改为未使用的端口(可自定义)。默认使用 80 端口,若无冲突则无需更改。
Error response from daemon: Get "https://registry-1.docker.io/v2/" : net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
docker 镜像配置(国内一般很难直接从 docker 官方源拉取镜像,因此要配置镜像源如下):
vim /etc/docker/daemon.json
more /etc/docker/daemon.json
{
"default-runtime" : "ascend" ,
"registry-mirrors" : [
"https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com" ,
"https://docker.m.daocloud.io" ,
"https://hub-mirror.c.163.com" ,
"https://mirror.baidubce.com" ,
"https://your_preferred_mirror" ,
"https://dockerhub.icu" ,
"https://docker.registry.cyou" ,
"https://docker-cf.registry.cyou" ,
"https://dockercf.jsdelivr.fyi" ,
"https://docker.jsdelivr.fyi" ,
"https://dockertest.jsdelivr.fyi" ,
"https://mirror.aliyuncs.com" ,
"https://dockerproxy.com" ,
"https://mirror.baidubce.com" ,
"https://docker.m.daocloud.io" ,
"https://docker.nju.edu.cn" ,
"https://docker.mirrors.sjtug.sjtu.edu.cn" ,
"https://docker.mirrors.ustc.edu.cn" ,
"https://mirror.iscas.ac.cn" ,
"https://docker.rainbond.cc"
] ,
"runtimes" : {
"ascend" : {
"path" : "/usr/local/Ascend/Ascend-Docker-Runtime/ascend-docker-runtime" ,
"runtimeArgs" : [ ]
}
}
}
添加完成后,需要重新加载 docker 的配置文件以生效:
systemctl restart docker.service
所有容器的运行状态与占用端口如下。应该看到包含 3 个业务服务(api / worker / web)以及 6 个基础组件(weaviate / db / redis / nginx / ssrf_proxy / sandbox)在内的总共 9 个容器,且 STATUS 均为 Up,服务全部挂起成功。
(3)可视化 web 配置 在浏览器内输入'本机 ip:端口号'该端口号为在启动 dify 时更改的 NGINX_PORT(见本章节(2)),若无更改,则使用默认的 80 端口登录。例如:网址:172.16.23.55:80
注意:这里又又又有一个坑啦!
第一次输入网址大概率无法访问网页,会出现如下界面!
原因:web 服务没有配置端口映射。需要在 web 服务下添加 ports 端口配置。在 dify 文件夹中找到 docker-compose.yml 文件,并作以下修改:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
123456789 abc nginx:latest "/docker-entrypoint...." 2 days ago Up 2 days 0.0 .0.0 :3000 ->80 /tcp web_container
如果 PORT 一列显示 0.0.0.0:3000->80/tcp 则表明主机中的 3000 端口正常被映射到 docker 中设置的 80 端口,此时 web 服务可以被启用;若映射不完整,只显示主机端口占用情况 0.0.0.0:3000 或者只有 docker 中设置的占用端口 80/tcp,那么都无法直接在网页中进行启动。此时就需要设置 docker-compose 中的映射端口。
cd /path/to/dify-main/docker
(4)在 service 中找到 web 服务的配置部分,在原文件中的 restart:always 和 environment 中间添加 ports 映射:
web:
image: langgenius/dify-web:0.14.1
restart: always
ports:
- "3000:80"
environment:
CONSOLE_API_URL: ${CONSOLE_API_URL:-}
APP_API_URL: ${APP_API_URL:-}
SENTRY_DSN: ${WEB_SENTRY_DSN:-}
NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED:-0}
TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000}
CSP_WHITELIST: ${CSP_WHITELIST:-}
当在宿主机上访问 http://<宿主机 IP>:80(例如,http://localhost:80 或者宿主机的 IP 地址),请求将被转发到容器的 80 端口。如果没有设置端口映射,容器的端口只对容器内部可用,外部无法访问。
docker compose down
docker compose up -d
输出如下,则代表 web 端口已映射,可以在网页中打开 Dify 了。
docker compose 同时管理多个容器,支持 web 和数据库访问管理。
services 定义了应用的不同服务,如:web 服务使用 Nginx 镜像,并暴露端口 80。db 服务使用 MySQL 镜像,并设置环境变量 MYSQL_ROOT_PASSWORD。
输入网址后界面如下,第一次登陆需要设置邮箱,用户名和密码等。
(1)大语言模型(LLM)
选择模型供应商中的 OpenAI-API-compatible 模块。点击添加模型。
模型类型选择'LLM','模型名称'与 Mind IE 服务化配置 dcoker 文件'config.json'中的'modelName'保持一致,例如之前配置的是 qwen3-32b 模型,'API endpoint URL'填写'http://本机 ip:qwen3-32b 的 port 端口/v1',。'模型上下文长度'与'最大 token 上限'按需填写。例如:http://172.16.23.55:1060
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online