利用华为云ECS服务器平台部署nanochat - 1 ECS服务器环境配置

基于华为云 GPU ECS 搭建 nanochat 运行环境并制作私有镜像

本文记录一次在利用华为云GPU ECS 从零配置nanochat运行环境的过程。总体实验流程为:租用一台带 NVIDIA Tesla T4 的 ECS,安装 NVIDIA 驱动、配置 Python 3.11、安装 nanochat 及 PyTorch CUDA 环境,最后将配置好的服务器制作成华为云私有镜像,方便后续直接基于镜像创建新服务器复用环境。

不过由于退出时没有截图记录故基本只能用文字形式展示,并含有一定原理解释,但总体流程与最终结果可以参考。

1.环境设置与配置:

首先由于华为云modelarts的GPU驱动的CUDA最高仅仅11.4,故我们用ECS手动按照驱动:

注意由于我们要重新安装驱动,故基础镜像选择无驱动的新环境:
image

2.验证显卡是否挂载驱动是否正常

image

3.正式配置:

这里我们可以看到又GPU了 但是没有驱动,我们先安装驱动:
首先,为了提高国内云服务器上的下载速度,将 Ubuntu apt 源切换为华为云镜像源:

cp /etc/apt/sources.list /etc/apt/sources.list.bak

cat > /etc/apt/sources.list <<'EOF'
deb https://mirrors.huaweicloud.com/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.huaweicloud.com/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.huaweicloud.com/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.huaweicloud.com/ubuntu/ jammy-security main restricted universe multiverse
EOF

apt clean
apt update

*Ubuntu apt 源是什么,为什么要先配置它

在 Ubuntu 中,安装软件通常不是像 Windows 那样去网页上下载一个 .exe 安装包,而是通过系统的软件包管理器来完成。Ubuntu 使用的是 Debian 系的包管理体系,常见命令包括:

apt update
apt install xxx
apt remove xxx

这里的 apt 可以理解为 Ubuntu 的“软件安装与更新管家”。它并不是自己凭空知道软件在哪里,而是根据系统中配置的软件仓库地址去查找软件包。Ubuntu 官方文档中也说明,Ubuntu 的大多数软件会被打包成 .deb 包,并放在软件仓库 repositories 中,用户通过包管理工具访问这些仓库来安装和更新软件。

所谓 apt 源,本质上就是这些软件仓库的地址。

以第一行为例:

deb https://mirrors.huaweicloud.com/ubuntu/ jammy main restricted universe multiverse

它可以拆成四部分理解:

deb
  表示这是二进制软件包仓库,也就是 apt install 直接安装的软件包来源。

https://mirrors.huaweicloud.com/ubuntu/
  表示软件仓库服务器地址,这里使用的是华为云 Ubuntu 镜像站。

jammy
  表示 Ubuntu 22.04 的发行版本代号。

main restricted universe multiverse
  表示启用哪些软件仓库组件。

Ubuntu 22.04 的版本代号是 jammy,所以 Ubuntu 22.04 的软件源通常使用 jammy、jammy-updates、jammy-backports、jammy-security 这些发行分支。Ubuntu 文档中也说明,仓库配置通常由 URI、Distribution 和 Components 等字段组成,其中 Components 就是仓库分区。

安装 NVIDIA 驱动

先安装驱动编译和管理所需的基础组件:

apt install -y ubuntu-drivers-common build-essential dkms linux-headers-$(uname -r)

然后查看可安装的 NVIDIA 驱动:

apt-cache policy nvidia-driver-570-server nvidia-utils-570-server

当时源里已经能看到类似:

nvidia-driver-570-server:
  Candidate: 570.211.01-0ubuntu1.22.04.1

nvidia-utils-570-server:
  Candidate: 570.211.01-0ubuntu1.22.04.1

接着安装驱动:

apt install -y nvidia-driver-570-server nvidia-utils-570-server

安装过程中实际拉取了 580-server 相关包,包括 nvidia-dkms-580-server、nvidia-driver-580-server、nvidia-utils-580-server 等,并且 DKMS 成功为当前内核编译了 nvidia.ko、nvidia-uvm.ko 等模块。安装日志中没有出现 DKMS build failed,说明驱动模块构建成功。

安装完成后重启(reboot)

注:如果没有候选版本,通常说明 apt 源配置不完整、没有启用 restricted 组件、系统版本/内核不匹配,或者该镜像源暂时没有对应驱动包。可以先执行 apt update,确认源中包含 jammy-updates restricted 和 jammy-security restricted,再用 ubuntu-drivers list --gpgpu 或 ubuntu-drivers install --gpgpu 查看/安装系统推荐的 NVIDIA server 驱动

之后用nvidia-smi验证驱动即可:
image

4.环境配置

nanochat 这类项目的 Python 依赖确实主要写在仓库里,所以环境配置相对简单项目仓库中已经通过 pyproject.toml 声明了 Python 版本要求和依赖包。比如 nanochat 的 pyproject.toml 中写明 requires-python = ">=3.10",并列出了 datasets、fastapi、torch==2.9.1、tokenizers、wandb 等核心依赖;同时项目还提供了 GPU extra,用于安装 CUDA 版 PyTorch 依赖。因此,在 Python 和 GPU 驱动准备好之后,只需要在项目目录中执行 uv sync --extra gpu --group dev,uv 就会根据仓库中的配置自动解析、下载并安装依赖。

基础的工具安装:

驱动确认成功后,安装后续配置 nanochat 所需工具:

apt update
apt install -y git curl tmux htop unzip ca-certificates build-essential

这些工具的作用如下:

工具 作用 在本次环境配置中的用途
git 代码版本管理工具 从 GitHub 拉取 nanochat 项目代码
curl 命令行下载工具 下载 uv 安装脚本、远程文件或测试网络访问
tmux 终端复用工具 SSH 断开后,安装或训练任务仍可在后台继续运行
htop 资源监控工具 查看 CPU、内存、进程占用情况
unzip 解压工具 解压 zip 格式的数据或项目文件
ca-certificates HTTPS 证书组件 让系统能正常访问 GitHub、PyPI、PyTorch 等 HTTPS 站点
build-essential 编译基础工具集合 为部分 Python 包或系统组件编译提供 gcc、make 等工具

拉取仓库安装虚拟环境:

项目放在 root 目录下:

mkdir -p /root/nanochat-exp
cd /root/nanochat-exp

git clone https://github.com/karpathy/nanochat.git
cd /root/nanochat-exp/nanochat

最终项目目录为:

/root/nanochat-exp/nanochat

配置 Python 3.11 与 nanochat GPU 环境

这里没有直接改系统自带的 Python,而是使用 uv 在项目目录下创建独立虚拟环境。这样做的好处是:系统 Python 保持不变,nanochat 的依赖包全部安装在 .venv 目录中,后续制作镜像时也能把这个独立环境一起保存下来。

uv 是一个 Python 项目管理工具,可以同时完成 Python 版本管理、虚拟环境创建、依赖解析和依赖安装。本次没有手动使用 pip install torch ... 一个个安装依赖,而是采用 nanochat 仓库推荐的 uv 工作流。项目仓库中的 pyproject.toml 记录了项目需要的 Python 版本、核心依赖和可选依赖,uv.lock 则记录了解析后的精确依赖版本。

因此,执行 uv sync --extra gpu --group dev 的含义不是简单下载某一个包,而是让 uv 根据项目配置文件把当前 .venv 虚拟环境同步到 nanochat 所需的状态。其中 --extra gpu 表示安装 GPU/CUDA 相关可选依赖,--group dev 表示安装开发调试依赖。执行完成后,当前虚拟环境中就会包含 nanochat 运行所需的 PyTorch CUDA、triton、datasets、fastapi 等依赖。

安装并指定 Python 3.11:

uv python install 3.11
uv venv --python 3.11
source .venv/bin/activate

然后验证当前使用的 Python 是否来自项目虚拟环境:

which python
python --version
readlink -f .venv/bin/python

本次最终输出为:

/root/nanochat-exp/nanochat/.venv/bin/python
Python 3.11.15
/root/.local/share/uv/python/cpython-3.11.15-linux-x86_64-gnu/bin/python3.11

这说明 nanochat 当前使用的是 uv 下载的 Python 3.11,而不是系统自带的 Python 3.10。

同步 nanochat GPU 依赖

nanochat 的项目依赖已经写在仓库的 pyproject.toml 和锁文件中,因此不需要手动一个个安装 torch、datasets、triton、fastapi 等包。这里使用 uv sync 按项目配置同步依赖。uv sync 会将项目环境同步到锁文件指定状态;对于可选依赖,uv 默认不会安装,需要通过 --extra 显式指定,例如这里的 --extra gpu。开发依赖组则可以通过 --group dev 安装。

由于云服务器直接访问 PyPI 时可能较慢,这里先配置华为云 PyPI 镜像源,并适当降低并发下载数量:

export UV_DEFAULT_INDEX=https://repo.huaweicloud.com/repository/pypi/simple
export UV_HTTP_TIMEOUT=300

echo 'export UV_DEFAULT_INDEX=https://repo.huaweicloud.com/repository/pypi/simple' >> ~/.bashrc
echo 'export UV_HTTP_TIMEOUT=300' >> ~/.bashrc

第一部分:临时生效的环境变量,这两行命令只在当前这个终端窗口有效。如果你关闭了这个窗口或者新开一个窗口,这两个设置就会失效。
第二部分:永久生效的配置
~/.bashrc:这是 Bash Shell 的个人配置文件。每当你在 Linux 或 WSL 中打开一个新的终端窗口时,系统都会自动读取并执行这个文件里的命令。
>>:这是“追加重定向”符号。它会把左边的内容添加到右边文件的末尾,而不会覆盖原有内容。
echo ...:把引号里的那行文字打印出来。
合起来的意思:把那两行 export命令写入到 ~/.bashrc文件的末尾。
这样做的结果是:以后你每次登录系统或打开新的终端,系统都会自动帮你设置好华为云镜像和超时时间,你就不用再手动输入了。
可以看需选择

然后执行依赖安装:

uv sync --extra gpu --group dev

这里的含义是:

--extra gpu    安装 nanochat 中声明的 GPU/CUDA 相关可选依赖
--group dev    安装开发、调试、测试相关依赖

需要注意的是,国内 PyPI 源主要加速普通 Python 包;PyTorch CUDA wheel 通常仍会根据项目配置访问对应的 PyTorch CUDA wheel 源。最终安装完成后,本次环境中的 PyTorch 版本为:

torch: 2.9.1+cu128
torch cuda: 12.8

这一步必须完整跑完,不能在 Preparing packages... 阶段就创建镜像。

验证 PyTorch CUDA 是否可用

依赖安装结束后,需要确认 PyTorch 是否真的能调用 GPU。只看 nvidia-smi 还不够,因为 nvidia-smi 只能说明系统驱动识别到了 GPU;真正跑模型还要确认 Python 环境中的 PyTorch 能正常使用 CUDA。

执行:

cd /root/nanochat-exp/nanochat
source .venv/bin/activate

python - <<'PY'
import torch

print("torch:", torch.__version__)
print("torch cuda:", torch.version.cuda)
print("cuda available:", torch.cuda.is_available())

if torch.cuda.is_available():
    print("gpu:", torch.cuda.get_device_name(0))
    x = torch.randn(1024, 1024, device="cuda")
    y = x @ x
    print("test:", y.shape, y.device)
PY

本次输出为:

torch: 2.9.1+cu128
torch cuda: 12.8
cuda available: True
gpu: Tesla T4
test: torch.Size([1024, 1024]) cuda:0

这说明 Python 3.11 虚拟环境、PyTorch CUDA 运行时和 Tesla T4 GPU 都已经正常连通。这里 nvidia-smi 显示 CUDA 13.0,而 PyTorch 显示 CUDA 12.8 并不冲突。前者表示 NVIDIA 驱动最高支持的 CUDA 能力,后者表示 PyTorch wheel 自带的 CUDA runtime 版本。只要驱动足够新,就可以运行较低版本的 CUDA runtime。

创建环境激活脚本

为了避免下次从镜像启动新服务器时还要重新找项目路径,可以写一个激活脚本:

cat > /root/activate_nanochat.sh <<'EOF'
#!/bin/bash
cd /root/nanochat-exp/nanochat
source .venv/bin/activate
export NANOCHAT_BASE_DIR=/root/nanochat-cache
export NANOCHAT_DTYPE=float16
echo "nanochat env activated"
echo "python: $(which python)"
python --version
EOF

chmod +x /root/activate_nanochat.sh
mkdir -p /root/nanochat-cache

以后进入服务器后,只需要执行:

source /root/activate_nanochat.sh

再验证:

python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available())"

如果输出中最后是 True,说明当前 shell 已经进入 nanochat 的 Python 环境。

5.创建华为云私有镜像

华为云** IMS **支持从已经配置好的 ECS 创建系统盘私有镜像。官方文档说明,基于 ECS 创建系统盘镜像时,可以将当前云服务器上的操作系统、已安装应用和配置保存为镜像,后续用该镜像创建新的 ECS。
image

6.总结与避坑

1)本来是像用modelarts平台实现的,但华为云目前的GPU的cuda驱动还很低,如果对版本要求较高还是建议试试这个方法(可能也有别的方法,本人由于有华为云白嫖的代金券所以在华为云平台下),尝试了一下门槛不高,直接一路执行即可
2)创建镜像前必须确认 .venv 和 PyTorch 已经完整安装,第一次第一次创建镜像失败的原因是.venv 没有真正创建成功,就去做镜像了。

本次最终可用环境如下:

云平台: 华为云 ECS
操作系统: Ubuntu 22.04
GPU: NVIDIA Tesla T4 15GB
NVIDIA Driver: 580.126.20
nvidia-smi CUDA Version: 13.0
项目路径: /root/nanochat-exp/nanochat
Python: 3.11.15
Python 路径: /root/nanochat-exp/nanochat/.venv/bin/python
PyTorch: 2.9.1+cu128
Torch CUDA: 12.8
CUDA 可用性: torch.cuda.is_available() == True

最终验证命令:

cd /root/nanochat-exp/nanochat
source .venv/bin/activate

python - <<'PY'
import torch

print("torch:", torch.__version__)
print("torch cuda:", torch.version.cuda)
print("cuda available:", torch.cuda.is_available())

if torch.cuda.is_available():
    print("gpu:", torch.cuda.get_device_name(0))
    x = torch.randn(1024, 1024, device="cuda")
    y = x @ x
    print("test:", y.shape, y.device)
PY

输出:

torch: 2.9.1+cu128
torch cuda: 12.8
cuda available: True
gpu: Tesla T4
test: torch.Size([1024, 1024]) cuda:0

这说明 ECS 上的 nanochat GPU 环境已经配置完成,可以制作私有镜像并在后续直接复用。

posted @ 2026-05-12 16:54  jinghuaz  阅读(61)  评论(0)    收藏  举报