已合并
[feat]devcontainer #40299
SCh_zx创建于 7月7日
[feat]devcontainer #40299
已合并
SCh_zx创建于 7月7日
5 个文件变更+46-144
A.devcontainer/devcontainer.json+28-0
@@ -0,0 +1,28 @@
1+{
2+ "name": "TorchNPU Dev (CANN)",
3+ "build": {
4+ "dockerfile": "../docker/devel/Dockerfile",
5+ "context": "..",
6+ "target": "dev",
7+ "args": {
8+ "PY_VERSION": "3.10",
9+ "TORCH_VERSION": "2.10.0",
10+ "CANN_VERSION": "9.1.0_beta.1",
11+ "CANN_PRODUCT": "910b"
12+ }
13+ },
14+ "workspaceMount": "source=${localWorkspaceFolder},target=/home/pytorch,type=bind,consistency=consistent",
15+ "workspaceFolder": "/home/pytorch",
16+ "remoteUser": "root",
17+ "privileged": true,
18+ "mounts": [
19+ "source=/dev,target=/dev,type=bind,consistency=consistent",
20+ "source=/usr/local/Ascend/driver,target=/usr/local/Ascend/driver,type=bind,consistency=consistent",
21+ "source=/usr/local/Ascend/add-ons,target=/usr/local/Ascend/add-ons,type=bind,consistency=consistent",
22+ "source=/usr/local/sbin/npu-smi,target=/usr/local/bin/npu-smi,type=bind,consistency=consistent",
23+ "source=/var/log/npu,target=/usr/slog,type=bind,consistency=consistent"
24+ ],
25+ "remoteEnv": {
26+ "LD_LIBRARY_PATH": "${containerEnv:LD_LIBRARY_PATH}:/usr/local/Ascend/driver/lib64:/usr/local/Ascend/driver/lib64/base:/usr/local/Ascend/driver/lib64/common:/usr/local/Ascend/driver/lib64/driver"
27+ }
28+}
Ddocker/builder/ARM/Dockerfile+0-120
@@ -1,120 +0,0 @@
1-FROM quay.io/pypa/manylinux_2_28_aarch64 AS base
2- 
3-ENV LC_ALL=en_US.UTF-8 \
4- LANG=en_US.UTF-8 \
5- LANGUAGE=en_US.UTF-8
6- 
7-ENV PATH=/usr/local/bin:$PATH
8- 
9-RUN echo "alias ll='ls -l --color=auto'" >> /root/.bashrc
10- 
11-ARG PY_VERSION=3.10
12- 
13-RUN cd /usr/local/bin \
14- && PY_TAG="cp$(echo ${PY_VERSION} | tr -d .)" \
15- && if [ ! -d "/opt/python/${PY_TAG}-${PY_TAG}" ]; then echo "Unsupported Python version: ${PY_VERSION}" && exit 1; fi \
16- && ln -sf /opt/python/${PY_TAG}-${PY_TAG}/bin/pip${PY_VERSION} pip${PY_VERSION} \
17- && ln -sf /opt/python/${PY_TAG}-${PY_TAG}/bin/pip${PY_VERSION} pip3 \
18- && ln -sf /opt/python/${PY_TAG}-${PY_TAG}/bin/pip${PY_VERSION} pip \
19- && ln -sf /opt/python/${PY_TAG}-${PY_TAG}/bin/python${PY_VERSION} python${PY_VERSION} \
20- && ln -sf /opt/python/${PY_TAG}-${PY_TAG}/bin/python${PY_VERSION} python3 \
21- && ln -sf /opt/python/${PY_TAG}-${PY_TAG}/bin/python${PY_VERSION} python
22- 
23-RUN mkdir /root/.pip \
24- && echo "[global]" > /root/.pip/pip.conf \
25- && echo "index-url=https://mirrors.huaweicloud.com/repository/pypi/simple" >> /root/.pip/pip.conf \
26- && echo "trusted-host=repo.huaweicloud.com" >> /root/.pip/pip.conf \
27- && echo "timeout=120" >> /root/.pip/pip.conf
28- 
29-RUN yum install -y \
30- bzip2 \
31- curl \
32- file \
33- git \
34- sudo \
35- unzip \
36- util-linux \
37- wget \
38- which && \
39- yum clean all && \
40- rm -rf /var/cache/yum && \
41- rm -rf /tmp/*
42- 
43-RUN git config --global --add safe.directory "*"
44- 
45-FROM base AS builder
46- 
47-ARG PY_VERSION
48-ARG DEVTOOLSET_VERSION=13
49-ARG TORCH_VERSION=2.10.0
50- 
51-RUN yum install -y \
52- autoconf \
53- automake \
54- bison \
55- diffutils \
56- make \
57- mold \
58- ninja-build \
59- patch \
60- perl \
61- yum-utils \
62- zlib-devel \
63- gcc-toolset-${DEVTOOLSET_VERSION}-gcc \
64- gcc-toolset-${DEVTOOLSET_VERSION}-gcc-c++ \
65- gcc-toolset-${DEVTOOLSET_VERSION}-gcc-gfortran \
66- gcc-toolset-${DEVTOOLSET_VERSION}-gdb && \
67- yum clean all && \
68- rm -rf /var/cache/yum && \
69- rm -rf /tmp/*
70- 
71-ENV PATH=/opt/rh/gcc-toolset-${DEVTOOLSET_VERSION}/root/usr/bin:$PATH \
72- LD_LIBRARY_PATH=/opt/rh/gcc-toolset-${DEVTOOLSET_VERSION}/root/usr/lib64:/opt/rh/gcc-toolset-${DEVTOOLSET_VERSION}/root/usr/lib:$LD_LIBRARY_PATH
73- 
74-RUN case "${PY_VERSION}" in \
75- 3.10) NUMPY_VER=1.22.4 ;; \
76- 3.11|3.12) NUMPY_VER=1.26.2 ;; \
77- 3.13) NUMPY_VER=2.1.2 ;; \
78- 3.14) NUMPY_VER=2.3.4 ;; \
79- *) echo "Unsupported Python version: ${PY_VERSION}" && exit 1 ;; \
80- esac && \
81- pip${PY_VERSION} install pyyaml && \
82- pip${PY_VERSION} install setuptools wheel && \
83- pip${PY_VERSION} install torch==${TORCH_VERSION} --index-url https://download.pytorch.org/whl/cpu && \
84- pip${PY_VERSION} install numpy==${NUMPY_VER}
85- 
86-FROM builder AS dev
87- 
88-ARG CANN_VERSION=9.1.0_beta.1
89-ARG CANN_PRODUCT=910b
90-ARG INSTALL_NNAL=0
91-ARG CANN_RELEASE_TRAIN=CANN%209.1.T1
92- 
93-RUN CANN_FILE_VER=$(echo ${CANN_VERSION} | sed 's/_beta/-beta/') && \
94- ARCH_NAME=$(uname -m) && \
95- CANN_URL=https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/CANN/${CANN_RELEASE_TRAIN} && \
96- ln -sf /dev/stdout /dev/tty && \
97- wget ${CANN_URL}/Ascend-cann-toolkit_${CANN_FILE_VER}_linux-${ARCH_NAME}.run && \
98- bash Ascend-cann-toolkit_${CANN_FILE_VER}_linux-${ARCH_NAME}.run --install --install-path=/usr/local/Ascend --quiet && \
99- rm -f Ascend-cann-toolkit_${CANN_FILE_VER}_linux-${ARCH_NAME}.run && \
100- wget ${CANN_URL}/Ascend-cann-${CANN_PRODUCT}-ops_${CANN_FILE_VER}_linux-${ARCH_NAME}.run && \
101- bash Ascend-cann-${CANN_PRODUCT}-ops_${CANN_FILE_VER}_linux-${ARCH_NAME}.run --install --type=toolkit --install-path=/usr/local/Ascend --quiet && \
102- rm -f Ascend-cann-${CANN_PRODUCT}-ops_${CANN_FILE_VER}_linux-${ARCH_NAME}.run && \
103- if [ "$INSTALL_NNAL" = "1" ]; then \
104- CANN_NNAL_VER=$(echo ${CANN_VERSION} | sed 's/_beta\.[0-9][0-9]*//') && \
105- wget ${CANN_URL}/Ascend-cann-nnal_${CANN_NNAL_VER}_linux-${ARCH_NAME}.run && \
106- bash Ascend-cann-nnal_${CANN_NNAL_VER}_linux-${ARCH_NAME}.run --install --install-path=/usr/local/Ascend --quiet && \
107- rm -f Ascend-cann-nnal_${CANN_NNAL_VER}_linux-${ARCH_NAME}.run; \
108- fi && \
109- rm -f /dev/tty && \
110- echo "source /usr/local/Ascend/cann/set_env.sh" > /etc/profile.d/cann.sh && \
111- if [ "$INSTALL_NNAL" = "1" ]; then \
112- echo "source /usr/local/Ascend/nnal/atb/set_env.sh" >> /etc/profile.d/cann.sh; \
113- fi && \
114- chmod +x /etc/profile.d/cann.sh && \
115- echo "source /usr/local/Ascend/cann/set_env.sh" >> /root/.bashrc && \
116- echo "export ASCEND_GLOBAL_LOG_LEVEL=3" >> /root/.bashrc && \
117- echo "export ASCEND_SLOG_PRINT_TO_STDOUT=0" >> /root/.bashrc && \
118- echo "export LD_LIBRARY_PATH=/usr/local/Ascend/cann/lib64:/usr/local/Ascend/cann/opp/op_proto/built-in:\$LD_LIBRARY_PATH" >> /root/.bashrc
119- 
120-WORKDIR /home
Rdocker/builder/X86/Dockerfiledocker/devel/Dockerfile+6-3
@@ -1,4 +1,4 @@
1-FROM quay.io/pypa/manylinux_2_28_x86_64 AS base1+FROM quay.io/pypa/manylinux_2_28 AS base
2 2 
3ENV LC_ALL=en_US.UTF-8 \3ENV LC_ALL=en_US.UTF-8 \
4 LANG=en_US.UTF-8 \4 LANG=en_US.UTF-8 \
@@ -47,6 +47,7 @@ FROM base AS builder
47ARG PY_VERSION47ARG PY_VERSION
48ARG DEVTOOLSET_VERSION=1348ARG DEVTOOLSET_VERSION=13
49ARG TORCH_VERSION=2.10.049ARG TORCH_VERSION=2.10.0
50+ARG TARGETARCH
50 51 
51RUN yum install -y \52RUN yum install -y \
52 autoconf \53 autoconf \
@@ -71,8 +72,10 @@ RUN yum install -y \
71ENV PATH=/opt/rh/gcc-toolset-${DEVTOOLSET_VERSION}/root/usr/bin:$PATH \72ENV PATH=/opt/rh/gcc-toolset-${DEVTOOLSET_VERSION}/root/usr/bin:$PATH \
72 LD_LIBRARY_PATH=/opt/rh/gcc-toolset-${DEVTOOLSET_VERSION}/root/usr/lib64:/opt/rh/gcc-toolset-${DEVTOOLSET_VERSION}/root/usr/lib:$LD_LIBRARY_PATH73 LD_LIBRARY_PATH=/opt/rh/gcc-toolset-${DEVTOOLSET_VERSION}/root/usr/lib64:/opt/rh/gcc-toolset-${DEVTOOLSET_VERSION}/root/usr/lib:$LD_LIBRARY_PATH
73 74 
74-RUN python3 -mpip install cmake==3.18.4.post1 && \75+RUN if [ "${TARGETARCH}" = "amd64" ]; then \
Jingwei Huang

看下这个环境变量是否加下,export DOCKER_BUILDKIT=1

likedislike
SCh_zx
7月7日 评论:
75- ln -sf /usr/local/bin/cmake /usr/bin/cmake376+ python3 -mpip install cmake==3.18.4.post1 && \
77+ ln -sf /usr/local/bin/cmake /usr/bin/cmake3; \
78+ fi
atomgit-bot
atomgit-botatomgit-bot7月7日

🟠 High Priority

变更位置: docker/devel/Dockerfile 第 50 行新增 ARG TARGETARCH, 第 75-78 行将 cmake 安装改为以 [ "${TARGETARCH}" = "amd64" ] 为条件的 if 块。

受影响行为: 旧版 Docker (未启用 BuildKit, DOCKER_BUILDKIT 未设置) 不会自动注入 TARGETARCH 变量, 该 ARG 会保持空字符串。条件 [ "" = "amd64" ] 为 false, 导致 cmake 在任何架构上都不会被安装。

失败模式: 用户在未启用 BuildKit 的环境下 (如 CentOS 7 默认 Docker, 或未设 DOCKER_BUILDKIT=1) 执行 builder.sh 或直接 docker build 后, cmake 缺失, 后续编译 torch_npu 源码时报 cmake: command not found, 构建失败。

触发条件: Docker daemon 未启用 BuildKit (Docker < 23.0 默认传统 builder, 或显式设置 DOCKER_BUILDKIT=0)。

旧行为: cmake 无条件安装 (第 74 行原代码), x86_64 构建始终可用。

  1. 将 Dockerfile 中的 TARGETARCH 替换为用户通过 --build-arg 传入的自定义 ARG (如 TARGET_ARCH), 由 builder.sh 传入 $(uname -m) 对应的值; 或
  2. 完全移除 TARGETARCH 条件, 恢复 cmake 无条件安装 (ARM 上 pip install cmake 通常也可用, 或 manylinux aarch64 镜像自带 cmake 时不会冲突)。

建议:推荐方案: 在 builder.sh 第 3 行 set -euo pipefail 之后添加 export DOCKER_BUILDKIT=1, 确保 BuildKit 始终启用, TARGETARCH 自动注入。同时在 Dockerfile 中将 ARG TARGETARCH 移至第一个 FROM 之前 (全局作用域), 使其在 base 阶段也可用 (虽然目前仅在 builder 阶段使用, 但提前声明更规范)。

likedislike
76 79 
77RUN case "${PY_VERSION}" in \80RUN case "${PY_VERSION}" in \
78 3.10) NUMPY_VER=1.22.4 ;; \81 3.10) NUMPY_VER=1.22.4 ;; \
Rdocker/builder/README.mddocker/devel/README.md+11-9
@@ -15,11 +15,17 @@ base manylinux + Python 软链接 + pip 源 + 基础系统包(curl/wget
15- **builder**(默认):用于编译 torch_npu wheel,不含 CANN15- **builder**(默认):用于编译 torch_npu wheel,不含 CANN
16- **dev**:基于 builder,叠加 CANN 运行环境;继承全部编译工具链,可在容器内直接重新编译16- **dev**:基于 builder,叠加 CANN 运行环境;继承全部编译工具链,可在容器内直接重新编译
17 17 
18+> Dockerfile会自动根据当前架构(ARM/X86)拉取对应镜像。
18> Driver 不包含在镜像中,用户需在宿主机自行安装。镜像仅提供 CANN 编译环境,运行时需宿主机已安装匹配的 NPU 驱动。19> Driver 不包含在镜像中,用户需在宿主机自行安装。镜像仅提供 CANN 编译环境,运行时需宿主机已安装匹配的 NPU 驱动。
19> 镜像中预装的 PyTorch CPU 版本默认为 v2.10.0 分支对应的版本(`torch==2.10.0`)。可通过构建参数 `TORCH_VERSION` 指定其他版本(如 `2.7.1`),详见 [构建参数参考](#构建参数参考)。20> 镜像中预装的 PyTorch CPU 版本默认为 v2.10.0 分支对应的版本(`torch==2.10.0`)。可通过构建参数 `TORCH_VERSION` 指定其他版本(如 `2.7.1`),详见 [构建参数参考](#构建参数参考)。
20 21 
21## 2 镜像构建22## 2 镜像构建
22 23 
24+```Shell
25+cd pytorch/docker/devel
26+export DOCKER_BUILDKIT=1
27+```
28+ 
23### 2.1 docker build 构建29### 2.1 docker build 构建
24 30 
25#### 构建参数参考31#### 构建参数参考
@@ -36,10 +42,6 @@ base manylinux + Python 软链接 + pip 源 + 基础系统包(curl/wget
36 42 
37#### 使用示例43#### 使用示例
38 44 
39-```Shell
40-cd pytorch/docker/builder/X86 # 或 ARM
41-```
42- 
43##### 场景一:构建 builder 镜像45##### 场景一:构建 builder 镜像
44 46 
45```Shell47```Shell
@@ -77,7 +79,7 @@ docker build -t manylinux-builder:v1 \
77 79 
78### 2.2 脚本构建80### 2.2 脚本构建
79 81 
80-> `builder.sh` 为 **Linux 构建脚本**,自动检测架(X86/ARM)、构建镜像并启动容器。82+> `builder.sh` 为 **Linux 构建脚本**,自动构建镜像并启动容器。
81 83 
82#### 参数说明84#### 参数说明
83 85 
@@ -115,14 +117,14 @@ bash builder.sh --cann --no-cache # 含 CANN 且不使用
115 117 
116### 场景一:builder 镜像118### 场景一:builder 镜像
117 119 
118-仅需挂载源码,无需 NPU 驱动透传。以下命令须在 `pytorch/docker/builder/X86`(或 `ARM`)目录下执行,与手动构建步骤的工作目录一致:120+仅需挂载源码,无需 NPU 驱动透传。以下命令须在 `pytorch/docker/devel`目录下执行,与手动构建步骤的工作目录一致:
119 121 
120```Shell122```Shell
121docker rm -f torch-npu-builder 2>/dev/null123docker rm -f torch-npu-builder 2>/dev/null
122 124 
123docker run -d --rm \125docker run -d --rm \
124 --name torch-npu-builder \126 --name torch-npu-builder \
125- -v $(pwd)/../../..:/home/pytorch \127+ -v $(pwd)/../..:/home/pytorch \
126 -e PY_VERSION=3.10 \128 -e PY_VERSION=3.10 \
127 manylinux-builder:v1 \129 manylinux-builder:v1 \
128 tail -f /dev/null130 tail -f /dev/null
@@ -139,7 +141,7 @@ docker run -d --rm \
139 --name torch-npu-builder \141 --name torch-npu-builder \
140 --privileged \142 --privileged \
141 -v /dev:/dev \143 -v /dev:/dev \
142- -v $(pwd)/../../..:/home/pytorch \144+ -v $(pwd)/../..:/home/pytorch \
143 -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \145 -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
144 -v /usr/local/Ascend/add-ons:/usr/local/Ascend/add-ons \146 -v /usr/local/Ascend/add-ons:/usr/local/Ascend/add-ons \
145 -v /usr/local/sbin/npu-smi:/usr/local/bin/npu-smi \147 -v /usr/local/sbin/npu-smi:/usr/local/bin/npu-smi \
@@ -183,7 +185,7 @@ docker exec -it torch-npu-builder bash
183 185 
184Windows 下命令格式与 Linux 的主要差异:186Windows 下命令格式与 Linux 的主要差异:
185 187 
186-- **工作目录**:需进入对应架构子目录,如 `pytorch\docker\builder\X86`(ARM 机器用 `ARM` 子目录188+- **工作目录**:需进入 `pytorch\docker\devel` 目录。
187- **路径分隔符**:使用反斜杠 `\`,而非正斜杠 `/`189- **路径分隔符**:使用反斜杠 `\`,而非正斜杠 `/`
188- **续行符**:PowerShell 使用反引号 `` ` ``,而非反斜杠 `\`。190- **续行符**:PowerShell 使用反引号 `` ` ``,而非反斜杠 `\`。
189- **挂载路径**:使用 Windows 风格(`E:\...`),Docker Desktop for Windows 会自动转换;切勿使用 MSYS 风格(`/e/...`)。191- **挂载路径**:使用 Windows 风格(`E:\...`),Docker Desktop for Windows 会自动转换;切勿使用 MSYS 风格(`/e/...`)。
Rdocker/builder/builder.shdocker/devel/builder.sh+1-12
@@ -122,18 +122,7 @@ if [ "${INSTALL_CANN}" -eq 1 ]; then
122fi122fi
123 123 
124ARCH=$(uname -m)124ARCH=$(uname -m)
125-case "${ARCH}" in125+DOCKERFILE_DIR="${SCRIPT_DIR}"
126-x86_64)
127- DOCKERFILE_DIR="${SCRIPT_DIR}/X86"
128- ;;
129-aarch64)
130- DOCKERFILE_DIR="${SCRIPT_DIR}/ARM"
131- ;;
132-*)
133- echo "Unsupported architecture: ${ARCH}"
134- exit 1
135- ;;
136-esac
137 126 
138if [ ! -f "${DOCKERFILE_DIR}/Dockerfile" ]; then127if [ ! -f "${DOCKERFILE_DIR}/Dockerfile" ]; then
139 echo "Dockerfile not found: ${DOCKERFILE_DIR}/Dockerfile"128 echo "Dockerfile not found: ${DOCKERFILE_DIR}/Dockerfile"