1. GPUStack与昇腾IA服务器部署概述
在异构计算领域,华为昇腾系列处理器凭借其独特的达芬奇架构,正在AI推理和训练场景中展现出越来越强的竞争力。而GPUStack作为面向AI工作负载的容器化部署方案,能够有效管理异构计算资源。本文将详细记录在昇腾Atlas 800 IA服务器(型号:9000)上部署GPUStack 2.3的全过程,涵盖从驱动安装到容器编排的每个技术细节。
这个部署方案特别适合需要离线环境的企业用户,我们采用的昇腾Atlas 800 IA服务器配备4张Atlas 300I Duo加速卡(每卡96GB HBM内存),操作系统为Kylin V10 SP2。整个部署涉及昇腾Toolkit工具链、Docker 20.10离线安装、GPUStack组件配置等关键环节,其中会重点解决昇腾设备与容器运行时之间的权限映射问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与前置检查
2.1 硬件兼容性验证
在开始部署前,必须确认服务器硬件与GPUStack的兼容性:
bash复制# 检查昇腾加速卡状态
npu-smi info
# 预期输出应显示所有加速卡的基本信息,包括:
# - 设备名称(如Atlas 300I Duo)
# - HBM内存容量
# - 固件版本
# - 温度状态
注意:如果npu-smi命令不可用,说明驱动未正确安装,需要先完成昇腾基础驱动部署。Atlas 300I Duo需要驱动版本不低于1.0.12。
2.2 操作系统配置
针对Kylin V10 SP2系统,需要进行以下关键配置:
bash复制# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 禁用SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 设置时区并同步时间
timedatectl set-timezone Asia/Shanghai
yum install -y chrony
systemctl enable chronyd
2.3 离线资源准备
由于企业环境通常限制外网访问,需要提前下载以下离线包:
- 昇腾NNRT(Neural Network Runtime)包
- Toolkit工具链(包含CANN组件)
- Docker 20.10离线安装包
- GPUStack 2.3发行包
- 相关依赖库(libreSSL、libncurses等)
文件目录建议按以下结构组织:
code复制/opt/offline_pkgs/
├── ascend/
│ ├── nnrt-5.1.0.alpha001-1.arm64.rpm
│ └── toolkit-5.1.0.alpha001-1.arm64.rpm
├── docker/
│ ├── docker-ce-20.10.9-3.el7.arm64.rpm
│ └── containerd.io-1.4.11-3.1.el7.arm64.rpm
└── gpustack/
├── gpustack-core-2.3.0.tar.gz
└── gpustack-cli-2.3.0.rpm
3. 昇腾基础环境部署
3.1 驱动安装
执行以下步骤安装昇腾驱动:
bash复制# 安装NNRT运行时
rpm -ivh /opt/offline_pkgs/ascend/nnrt-5.1.0.alpha001-1.arm64.rpm
# 验证驱动加载
lsmod | grep npu
# 应显示npu相关内核模块
# 设置环境变量
echo "export ASCEND_HOME=/usr/local/Ascend" >> /etc/profile
echo "source $ASCEND_HOME/nnrt/set_env.sh" >> /etc/profile
source /etc/profile
3.2 Toolkit工具链安装
Toolkit包含CANN(Compute Architecture for Neural Networks)等关键组件:
bash复制rpm -ivh /opt/offline_pkgs/ascend/toolkit-5.1.0.alpha001-1.arm64.rpm
# 验证安装
ascend-dmi -i
# 输出应包含设备拓扑和固件信息
# 安装kernel-devel匹配当前内核版本
yum install -y kernel-devel-$(uname -r)
3.3 设备权限配置
为容器运行时准备设备访问权限:
bash复制# 创建设备访问组
groupadd -g 1001 gpustack
usermod -aG gpustack root
# 配置udev规则
cat > /etc/udev/rules.d/99-npu.rules <<EOF
KERNEL=="npu*", MODE="0660", GROUP="gpustack"
EOF
udevadm control --reload
4. Docker环境部署
4.1 离线安装Docker
由于生产环境通常需要离线部署,采用rpm包安装:
bash复制# 安装containerd
rpm -ivh /opt/offline_pkgs/docker/containerd.io-1.4.11-3.1.el7.arm64.rpm
# 安装Docker CE
rpm -ivh /opt/offline_pkgs/docker/docker-ce-20.10.9-3.el7.arm64.rpm
# 配置Docker守护进程
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"group": "gpustack"
}
EOF
systemctl enable docker
systemctl start docker
4.2 昇腾设备插件部署
GPUStack需要识别昇腾设备资源:
bash复制# 创建设备插件配置
cat > /etc/gpustack/ascend-device-plugin.yaml <<EOF
deviceMemoryScaling: 1.0
volumes:
- name: device-plugin
hostPath:
path: /usr/local/Ascend
volumeMounts:
- name: device-plugin
mountPath: /usr/local/Ascend
resources:
requests:
cpu: 250m
memory: 64Mi
limits:
cpu: 500m
memory: 128Mi
EOF
5. GPUStack核心组件部署
5.1 安装GPUStack Core
解压核心组件并初始化:
bash复制tar -zxvf /opt/offline_pkgs/gpustack/gpustack-core-2.3.0.tar.gz -C /opt
cd /opt/gpustack/core
./install.sh --offline --ascend-home=/usr/local/Ascend
# 验证安装
gpustack-cli version
# 应显示核心组件和插件版本
5.2 配置容器运行时
修改containerd配置以支持昇腾设备:
bash复制mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 在config.toml中增加以下内容
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "nvidia"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
privileged_without_host_devices = false
runtime_engine = ""
runtime_root = ""
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
BinaryName = "/usr/local/bin/nvidia-container-runtime"
SystemdCgroup = true
5.3 网络插件配置
GPUStack需要特定的网络插件支持:
bash复制cat > /etc/gpustack/net-config.yaml <<EOF
apiVersion: gpustack.io/v1
kind: NetworkConfig
metadata:
name: ascend-net
spec:
networkMode: "macvlan"
masterInterface: "eth0"
ipRange: "192.168.1.100/24"
gateway: "192.168.1.1"
EOF
gpustack-cli apply -f /etc/gpustack/net-config.yaml
6. 部署验证与测试
6.1 运行测试容器
验证昇腾设备在容器中的可见性:
bash复制docker run --rm -it \
--device=/dev/davinci0 \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
ascendhub.huawei.com/public/ascend-toolkit:5.1.0 \
npu-smi info
6.2 资源调度测试
创建测试Pod验证资源分配:
yaml复制apiVersion: v1
kind: Pod
metadata:
name: ascend-test
spec:
containers:
- name: test
image: ascendhub.huawei.com/public/ascend-toolkit:5.1.0
command: ["sleep", "infinity"]
resources:
limits:
gpustack.ai/ascend: 1
nodeSelector:
gpustack.ai/ascend: "true"
应用配置并验证:
bash复制kubectl apply -f test-pod.yaml
kubectl exec -it ascend-test -- npu-smi info
7. 常见问题排查
7.1 设备未识别问题
如果容器内无法识别昇腾设备,按以下步骤排查:
-
检查主机设备状态:
bash复制ls /dev | grep davinci # 应显示davinci0等设备节点 -
验证驱动加载:
bash复制dmesg | grep npu # 检查是否有驱动加载错误 -
检查容器运行时日志:
bash复制
journalctl -u containerd -f
7.2 性能调优建议
针对昇腾300I Duo卡的优化配置:
bash复制# 设置CPU亲和性
for dev in $(ls /dev/davinci*); do
echo "0-15" > /sys/class/misc/$(basename $dev)/device/affinity
done
# 调整HBM内存频率
npu-smi set -t med-high -i 0-3
7.3 日志收集方法
当出现问题时,收集以下关键日志:
bash复制# 昇腾驱动日志
cp -r /var/log/ascend_seclog /tmp/debug_logs
cp /var/log/npu*.log /tmp/debug_logs
# GPUStack组件日志
journalctl -u gpustack-core > /tmp/debug_logs/gpustack-core.log
kubectl logs -n gpustack-system -l app=gpustack-scheduler > /tmp/debug_logs/scheduler.log
8. 生产环境优化建议
8.1 高可用配置
对于关键业务场景,建议部署GPUStack控制平面的高可用:
bash复制gpustack-cli init --ha --ascend-home=/usr/local/Ascend \
--control-plane-nodes node1,node2,node3 \
--data-plane-nodes worker1,worker2
8.2 监控集成
配置Prometheus监控指标:
yaml复制# gpustack-monitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: gpustack-monitor
namespace: gpustack-system
spec:
endpoints:
- port: metrics
interval: 15s
selector:
matchLabels:
app: gpustack-core
8.3 安全加固
实施最小权限原则:
bash复制# 创建专用服务账户
kubectl create serviceaccount gpustack-user -n gpustack-system
# 分配RBAC权限
kubectl create rolebinding gpustack-user-binding \
--clusterrole=gpustack-user \
--serviceaccount=gpustack-system:gpustack-user \
--namespace=gpustack-system
