已合并
support webide,docker build env #129
zhangjie创建于 3月24日
support webide,docker build env #129
已合并
zhangjie创建于 3月24日
4 个文件变更+511-0
@@ -0,0 +1,181 @@
1+# 环境部署
2+ 
3+请您先参考下面步骤完成基础环境搭建和源码下载,确保已安装NPU驱动、固件和CANN软件(`Ascend-cann-toolkit``Ascend-cann-ops`)等。
4+ 
5+## 环境准备
6+ 
7+本项目提供多种搭建昇腾环境的方式,请按需选择。
8+ 
9+> **说明**:本文提到的编译态和运行态含义如下,请根据实际情况选择。
10+>
11+> - 编译态:针对仅编译本项目不运行的场景,只需安装CANN toolkit包。
12+> - 运行态:针对运行本项目的场景(编译运行或纯运行),需安装驱动与固件、CANN toolkit包、CANN ops包。
13+ 
14+| 安装方式 | 使用说明 | 使用场景 |
15+| ----- | ------ | ------ |
16+| WebIDE | 一站式开发平台,提供在线直接运行的昇腾环境,无需手动安装。<br>当前可提供单机算力,**默认安装最新商发版CANN包**。 | 适用于没有昇腾设备的开发者。|
17+| Docker | Docker镜像是一种高效部署方式,已预集成CANN包和必备依赖。<br>当前仅适用于Atlas A2系列产品,OS仅支持Ubuntu操作系统。**默认安装最新商发版CANN包**。 |适用有昇腾设备,需要快速搭建环境的开发者。|
18+| 手动安装 | - |适用有昇腾设备,想体验手动安装CANN包或体验最新master分支能力的开发者。|
19+ 
20+### 方式1:WebIDE环境
21+ 
22+对于无昇腾设备的开发者,可直接使用WebIDE开发平台,即“**一站式开发平台**”,该平台为您提供在线可直接运行的昇腾环境,环境中已安装必备的驱动固件、软件包和依赖,无需手动安装。更多关于开发平台的介绍请参考[LINK](https://gitcode.com/org/cann/discussions/54)。
23+ 
24+1. 进入开源项目,单击“`云开发`”按钮,使用已认证过的华为云账号登录。若未注册或认证,请根据页面提示进行注册和认证。
25+ 
26+ <img src="./figures/cloudIDE.png" alt="云平台" width="750px" height="90px">
27+ 
28+2. 根据页面提示创建并启动云开发环境,单击“`连接 > WebIDE `”进入一站式开发平台,开源项目的源码资源默认在`/mnt/workspace`目录下。
29+ 
30+ <img src="./figures/webIDE.png" alt="云平台" width="1000px" height="150px">
31+ 
32+ 
33+### 方式2:Docker部署
34+ 
35+对于不依赖昇腾设备的开发者,若您想快速搭建昇腾环境,可使用Docker镜像部署。
36+ 
37+> **说明**:镜像文件比较大,下载需要一定时间,请您耐心等待。关于docker命令的选项介绍可通过`docker --help`查询。
38+ 
39+1.**下载镜像**
40+ 
41+- 步骤1:以root用户登录宿主机。确保宿主机已安装Docker引擎(版本1.11.2及以上)。
42+- 步骤2:从[昇腾镜像仓库](https://www.hiascend.com/developer/ascendhub/detail/17da20d1c2b6493cb38765adeba85884)拉取已预集成CANN软件包及开发所需依赖的镜像。命令如下,根据实际架构选择:
43+ 
44+ ```bash
45+ # 示例:拉取ARM架构的CANN开发镜像
46+ docker pull --platform=arm64 swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.0-910b-ubuntu22.04-py3.10-ops
47+ # 示例:拉取X86架构的CANN开发镜像
48+ docker pull --platform=amd64 swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.0-910b-ubuntu22.04-py3.10-ops
49+ ```
50+ 
51+2.**运行Docker**
52+拉取镜像后,需要以特定参数启动容器,以便容器内能访问宿主的昇腾设备。
53+ 
54+```bash
55+docker run --name oam-tools -it swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.0-910b-ubuntu22.04-py3.10-ops bash
56+```
57+| 参数 | 说明 | 注意事项 |
58+| :--- | :--- | :--- |
59+| `--name oam-tools` | 为容器指定名称,便于管理。 | 可自定义。 |
60+| `-it` | `-i`(交互式)和 `-t`(分配伪终端)的组合参数。 | - |
61+| `swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.0-910b-ubuntu22.04-py3.10-ops` | 指定要运行的Docker镜像。 |请确保此镜像名和标签(tag)与你通过`docker pull`拉取的镜像完全一致。 |
62+| `bash` | 容器启动后立即执行的命令。 | - |
63+ 
64+3.**初始化环境**
65+进入容器后,执行以下命令初始化环境:
66+ 
67+```bash
68+curl -fsSL https://gitcode.com/oam-tools/init_env.sh | bash
69+```
70+ 
71+### 方式3:手动安装
72+ 
73+对于有昇腾设备的开发者,若您想手动搭建昇腾环境,请参考下述步骤。
74+ 
75+#### 前置依赖
76+ 
77+ 本项目源码编译用到的依赖如下,请注意版本要求。
78+ 
79+ - python >= 3.9.0
80+ - gcc >= 7.3.0
81+ - cmake >= 3.16.0
82+ - ccache
83+ - CANN toolkit组合包:`Ascend-cann-toolkit_${cann_version}_linux-${arch}.run`
84+ - CANN ops组合包:`Ascend-cann-${chip_type}-ops_${cann_version}_linux-${arch}.run`
85+ - protobuf >= 25.1
86+ - abseil >= 20230802.1
87+ - json >= 3.11.3
88+ - googletest(仅执行UT时依赖,建议版本 release-1.11.0)
89+ - mockcpp(仅执行UT时依赖,建议版本 2.7)
90+ - pytest(仅执行UT时依赖,建议版本 9.0.1)
91+
92+ 其中:
93+ - \$\{chip\_type\}:表示昇腾AI处理器型号,如910_93、910b等。
94+ - \$\{cann\_version\}:表示CANN包版本号,需要与Toolkit包版本号相同。
95+ - \$\{arch\}:表示CPU架构,如aarch64、x86_64。
96+ 
97+#### 软件安装
98+ 
99+1. **安装驱动与固件(运行态依赖)**
100+ 
101+ 驱动与固件的下载和安装操作请参考《[CANN软件安装指南](https://www.hiascend.com/document/redirect/CannCommunityInstWizard)》中“准备软件包”和“安装NPU驱动和固件”章节。驱动与固件是运行态依赖,若仅编译算子,可以不安装。
102+ 
103+2. **安装CANN包**
104+ 
105+ - **场景1:体验master版本能力或基于master版本进行开发**
106+ 
107+ 请单击[下载链接](https://ascend.devcloud.huaweicloud.com/artifactory/cann-run-mirror/software/master/),选择最新时间版本,并根据产品型号和环境架构下载对应包。安装命令如下,更多指导参考《[CANN软件安装指南](https://www.hiascend.com/document/redirect/CannCommunityInstWizard)》。
108+ 
109+ 1. 安装CANN toolkit包
110+ 
111+ ```bash
112+ # 确保安装包具有可执行权限
113+ chmod +x Ascend-cann-toolkit_${cann_version}_linux-${arch}.run
114+ # 安装命令
115+ ./Ascend-cann-toolkit_${cann_version}_linux-${arch}.run --install --install-path=${install_path}
116+ ```
117+ 
118+ 2. 安装CANN ops包(运行态依赖)
119+ 
120+ ops包是运行态依赖,若仅编译算子,可不安装此包。
121+ 
122+ ```bash
123+ # 确保安装包具有可执行权限
124+ chmod +x Ascend-cann-${soc_name}-ops_${cann_version}_linux-${arch}.run
125+ # 安装命令
126+ ./Ascend-cann-${soc_name}-ops_${cann_version}_linux-${arch}.run --install --install-path=${install_path}
127+ ```
128+ 
129+ - \$\{cann\_version\}:表示CANN包版本号。
130+ - \$\{arch\}:表示CPU架构,如aarch64、x86_64。
131+ - \$\{soc\_name\}:表示NPU型号名称。
132+ - \$\{install\_path\}:表示指定安装路径,ops包需与toolkit包安装在相同路径,root用户默认安装在`/usr/local/Ascend`目录。
133+ 
134+ - **场景2:体验已发布版本能力或基于已发布版本进行开发**
135+ 
136+ 请访问[CANN官网下载中心](https://www.hiascend.com/cann/download),选择发布版本(仅支持CANN 8.5.0及后续版本),并根据产品型号和环境架构下载对应包,最后参考网页提供的命令完成安装。
137+ 
138+## 环境验证
139+ 
140+安装完CANN包后,需验证环境和驱动是否正常。
141+ 
142+- **检查NPU设备**
143+ 
144+ ```bash
145+ # 运行npu-smi,若能正常显示设备信息,则驱动正常
146+ npu-smi info
147+ ```
148+- **检查CANN安装**
149+ 
150+ ```bash
151+ # 查看CANN toolkit包版本信息(默认路径安装),WebIDE场景下将/usr/local替换为/home/developer
152+ cat /usr/local/Ascend/cann/${arch}-linux/ascend_toolkit_install.info
153+ # 查看CANN ops包版本信息(默认路径安装),WebIDE场景下将/usr/local替换为/home/developer
154+ cat /usr/local/Ascend/cann/${arch}-linux/ascend_ops_install.info
155+ ```
156+ 
157+## 环境变量配置
158+ 
159+按需选择合适的命令使环境变量生效。
160+```bash
161+# 默认路径安装,以root用户为例(非root用户,将/usr/local替换为${HOME})
162+source /usr/local/Ascend/cann/set_env.sh
163+# 指定路径安装
164+# source ${install_path}/cann/set_env.sh
165+```
166+ 
167+## 源码下载
168+ 
169+源码下载命令如下,请将\$\{tag\_version\}替换为目标分支标签名,源码分支标签与CANN版本配套关系参见[release仓库](https://gitcode.com/cann/release-management)。
170+ 
171+```bash
172+# 下载项目对应分支源码
173+git clone -b ${tag_version} https://gitcode.com/cann/otm-tools.git
174+```
175+ 
176+对于WebIDE或Docker环境,已默认提供最新商发版本的项目源码,如需获取其他版本的源码,也需通过上述命令下载源码。
177+ 
178+> [!NOTE] 注意
179+>
180+> - gitcode平台在使用HTTPS协议的时候要配置并使用个人访问令牌代替登录密码进行克隆,推送等操作。
181+> - 若您的编译环境无法访问网络,无法通过git指令下载代码,请先在联网环境中下载源码,再手动上传至目标环境。
@@ -0,0 +1,330 @@
1+#!/bin/bash
2+# ----------------------------------------------------------------------------
3+# Copyright (c) 2025 Huawei Technologies Co., Ltd.
4+#
5+# Licensed under the Apache License, Version 2.0 (the "License");
6+# you may not use this file except in compliance with the License.
7+# You may obtain a copy of the License at
8+#
9+# http://www.apache.org/licenses/LICENSE-2.0
10+#
11+# Unless required by applicable law or agreed to in writing, software
12+# distributed under the License is distributed on an "AS IS" BASIS,
13+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+# See the License for the specific language governing permissions and
15+# limitations under the License.
16+# ----------------------------------------------------------------------------
17+ 
18+set -e
19+ 
20+RED='\033[0;31m'
21+GREEN='\033[0;32m'
22+YELLOW='\033[1;33m'
23+NC='\033[0m'
24+ 
25+CANN_VERSION="8.5.0"
26+CHIP_TYPE="910b"
27+CANN_BASE_URL="https://ascend.devcloud.huaweicloud.com/artifactory/cann-run/software"
28+INSTALL_PATH="${INSTALL_PATH:-/usr/local/Ascend}"
29+ 
30+log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
31+log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
32+log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
33+ 
34+check_command() { command -v "$1" &>/dev/null; }
35+ 
36+get_arch() {
37+ local arch=$(uname -m)
38+ case $arch in
39+ x86_64) echo "x86_64" ;;
40+ aarch64) echo "aarch64" ;;
41+ *) log_error "Unsupported architecture: $arch"; return 1 ;;
42+ esac
43+}
44+ 
45+detect_cann_path() {
46+ local paths=(
47+ "/usr/local/Ascend/ascend-toolkit/latest"
48+ "/usr/local/Ascend/latest"
49+ "/usr/local/Ascend/cann-${CANN_VERSION}"
50+ "/usr/local/Ascend/cann-${CANN_VERSION}-beta.1"
51+ "/usr/local/Ascend/cann"
52+ "$HOME/Ascend/ascend-toolkit/latest"
53+ "$HOME/Ascend/latest"
54+ "$HOME/Ascend/cann-${CANN_VERSION}"
55+ "$HOME/Ascend/cann-${CANN_VERSION}-beta.1"
56+ "$HOME/Ascend/cann"
57+ )
58+ 
59+ for p in "${paths[@]}"; do
60+ if [ -d "$p" ] && [ -f "$p/bin/setenv.bash" ]; then
61+ echo "$p"
62+ return 0
63+ fi
64+ done
65+ 
66+ if [ -d "/usr/local/Ascend" ]; then
67+ for d in /usr/local/Ascend/ascend-toolkit/*; do
68+ [ -d "$d" ] && [ -f "$d/bin/setenv.bash" ] && echo "$d" && return 0
69+ done
70+ for d in /usr/local/Ascend/cann-*; do
71+ [ -d "$d" ] && [ -f "$d/bin/setenv.bash" ] && echo "$d" && return 0
72+ done
73+ fi
74+ return 1
75+}
76+ 
77+install_cann() {
78+ log_info "Checking CANN installation..."
79+ 
80+ local existing_cann=$(detect_cann_path)
81+ if [ -n "$existing_cann" ]; then
82+ log_info "CANN already installed at: $existing_cann"
83+ return 0
84+ fi
85+ 
86+ log_info "CANN not found, starting installation..."
87+ log_warn "This will download ~3GB of packages"
88+ 
89+ local arch=$(get_arch)
90+ local download_dir="/tmp/cann_install"
91+ mkdir -p "$download_dir"
92+ cd "$download_dir"
93+ 
94+ local toolkit_pkg="Ascend-cann-toolkit_${CANN_VERSION}_linux-${arch}.run"
95+ local ops_pkg="Ascend-cann-${CHIP_TYPE}-ops_${CANN_VERSION}_linux-${arch}.run"
96+ local toolkit_url="${CANN_BASE_URL}/${CANN_VERSION}/${arch}/${toolkit_pkg}"
97+ local ops_url="${CANN_BASE_URL}/${CANN_VERSION}/${arch}/${ops_pkg}"
98+ 
99+ if [ ! -f "$toolkit_pkg" ]; then
100+ log_info "Downloading CANN toolkit (${arch})..."
101+ log_info "URL: $toolkit_url"
102+ wget -q --show-progress --no-check-certificate -O "$toolkit_pkg" "$toolkit_url" || {
103+ log_error "Failed to download toolkit"
104+ return 1
105+ }
106+ fi
107+ 
108+ if [ ! -f "$ops_pkg" ]; then
109+ log_info "Downloading CANN ops (${CHIP_TYPE}, ${arch})..."
110+ log_info "URL: $ops_url"
111+ wget -q --show-progress --no-check-certificate -O "$ops_pkg" "$ops_url" || {
112+ log_error "Failed to download ops"
113+ return 1
114+ }
115+ fi
116+ 
117+ log_info "Installing CANN toolkit..."
118+ chmod +x "$toolkit_pkg"
119+ ./$toolkit_pkg --full --install-path="$INSTALL_PATH" || {
120+ log_error "Failed to install toolkit"
121+ return 1
122+ }
123+ 
124+ log_info "Installing CANN ops..."
125+ chmod +x "$ops_pkg"
126+ ./$ops_pkg --install --install-path="$INSTALL_PATH" || {
127+ log_warn "Ops installation may have issues (this can be normal on non-NPU systems)"
128+ }
129+ 
130+ log_info "Cleaning up..."
131+ rm -f "$toolkit_pkg" "$ops_pkg"
132+ cd - > /dev/null
133+ 
134+ log_info "CANN installation completed"
135+}
136+ 
137+setup_cann_env() {
138+ log_info "Setting up CANN environment..."
139+ 
140+ CANN_PATH=$(detect_cann_path)
141+ if [ -z "$CANN_PATH" ]; then
142+ log_error "CANN installation not found after installation!"
143+ return 1
144+ fi
145+ 
146+ log_info "CANN path: $CANN_PATH"
147+ export ASCEND_HOME_PATH="$CANN_PATH"
148+ 
149+ if [ -f "$CANN_PATH/bin/setenv.bash" ]; then
150+ source "$CANN_PATH/bin/setenv.bash"
151+ log_info "Sourced setenv.bash"
152+ fi
153+ 
154+ local pkg_inc="$CANN_PATH/pkg_inc"
155+ local arch_inc=""
156+
157+ if [ -d "$CANN_PATH/x86_64-linux/include" ]; then
158+ arch_inc="$CANN_PATH/x86_64-linux/include"
159+ elif [ -d "$CANN_PATH/aarch64-linux/include" ]; then
160+ arch_inc="$CANN_PATH/aarch64-linux/include"
161+ fi
162+ 
163+ if [ -n "$arch_inc" ] && [ -d "$arch_inc" ]; then
164+ mkdir -p "$pkg_inc"
165+ for dir in mmpa fmk ts adump; do
166+ if [ ! -e "$pkg_inc/$dir" ] && [ -d "$arch_inc/$dir" ]; then
167+ ln -sf "$arch_inc/$dir" "$pkg_inc/$dir" 2>/dev/null && \
168+ log_info "Linked $dir"
169+ fi
170+ done
171+ fi
172+}
173+ 
174+install_system_deps() {
175+ log_info "Checking system dependencies..."
176+ 
177+ if check_command apt-get; then
178+ apt-get update -qq 2>/dev/null
179+ local pkgs=""
180+ check_command curl || pkgs="$pkgs curl"
181+ check_command wget || pkgs="$pkgs wget"
182+ check_command git || pkgs="$pkgs git"
183+ check_command cmake || pkgs="$pkgs cmake"
184+ check_command make || pkgs="$pkgs make"
185+ check_command g++ || pkgs="$pkgs g++"
186+ check_command ccache || pkgs="$pkgs ccache"
187+
188+ if [ -n "$pkgs" ]; then
189+ log_info "Installing:$pkgs"
190+ apt-get install -y -qq $pkgs 2>/dev/null || log_warn "Some packages may have failed"
191+ fi
192+ elif check_command yum; then
193+ local pkgs=""
194+ check_command curl || pkgs="$pkgs curl"
195+ check_command wget || pkgs="$pkgs wget"
196+ check_command git || pkgs="$pkgs git"
197+ check_command cmake || pkgs="$pkgs cmake"
198+ check_command make || pkgs="$pkgs make"
199+ check_command g++ || pkgs="$pkgs gcc-c++"
200+
201+ if [ -n "$pkgs" ]; then
202+ log_info "Installing:$pkgs"
203+ yum install -y -q $pkgs 2>/dev/null || log_warn "Some packages may have failed"
204+ fi
205+ fi
206+ 
207+ log_info "cmake: $(cmake --version 2>&1 | head -1)"
208+ log_info "g++: $(g++ --version 2>&1 | head -1)"
209+ check_command ccache && log_info "ccache: available" || log_warn "ccache: not installed"
210+}
211+ 
212+install_python_deps() {
213+ log_info "Checking Python dependencies..."
214+ 
215+ local python="python3"
216+ check_command python3 || python="python"
217+
218+ log_info "Python: $($python --version 2>&1)"
219+ 
220+ local required=("pytest>=9.0.1" "coverage>=7.10.0" "pytest-cov>=7.0.0")
221+ local to_install=()
222+ 
223+ for pkg in "${required[@]}"; do
224+ local name=$(echo "$pkg" | sed 's/>=.*//')
225+ $python -c "import $name" 2>/dev/null || to_install+=("$pkg")
226+ done
227+ 
228+ if [ ${#to_install[@]} -ne 0 ]; then
229+ log_info "Installing Python packages: ${to_install[*]}"
230+ $python -m pip install --upgrade pip -q 2>/dev/null || true
231+ $python -m pip install "${to_install[@]}" -q 2>/dev/null || \
232+ log_warn "Some Python packages may have failed to install"
233+ else
234+ log_info "All Python dependencies satisfied"
235+ fi
236+ 
237+ check_command pytest && log_info "pytest: $(pytest --version 2>&1 | head -1)"
238+ check_command coverage && log_info "coverage: $(coverage --version 2>&1 | head -1)"
239+}
240+ 
241+show_help() {
242+ echo "Usage: $0 [OPTIONS]"
243+ echo ""
244+ echo "oam-tools development environment setup script"
245+ echo ""
246+ echo "Options:"
247+ echo " --cann-version VERSION CANN version (default: ${CANN_VERSION})"
248+ echo " --chip-type TYPE Chip type: 910b, 910_93, etc. (default: ${CHIP_TYPE})"
249+ echo " --install-path PATH Installation path (default: ${INSTALL_PATH})"
250+ echo " --skip-cann Skip CANN installation"
251+ echo " --help Show this help"
252+ echo ""
253+ echo "Examples:"
254+ echo " $0 # Install with defaults"
255+ echo " $0 --skip-cann # Skip CANN, install only deps"
256+ echo " $0 --chip-type 910_93 # Use 910_93 ops package"
257+ echo ""
258+}
259+ 
260+main() {
261+ local SKIP_CANN=false
262+ 
263+ while [[ $# -gt 0 ]]; do
264+ case $1 in
265+ --cann-version)
266+ CANN_VERSION="$2"
267+ shift 2
268+ ;;
269+ --chip-type)
270+ CHIP_TYPE="$2"
271+ shift 2
272+ ;;
273+ --install-path)
274+ INSTALL_PATH="$2"
275+ shift 2
276+ ;;
277+ --skip-cann)
278+ SKIP_CANN=true
279+ shift
280+ ;;
281+ --help|-h)
282+ show_help
283+ exit 0
284+ ;;
285+ *)
286+ log_warn "Unknown option: $1"
287+ shift
288+ ;;
289+ esac
290+ done
291+ 
292+ echo ""
293+ echo "=========================================="
294+ echo " oam-tools Development Environment Setup"
295+ echo "=========================================="
296+ echo ""
297+ echo "Configuration:"
298+ echo " CANN Version: ${CANN_VERSION}"
299+ echo " Chip Type: ${CHIP_TYPE}"
300+ echo " Install Path: ${INSTALL_PATH}"
301+ echo ""
302+ 
303+ local work_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
304+ cd "$work_dir"
305+ log_info "Working directory: $work_dir"
306+ 
307+ install_system_deps
308+ 
309+ if [ "$SKIP_CANN" = true ]; then
310+ log_info "Skipping CANN installation (--skip-cann)"
311+ else
312+ install_cann
313+ fi
314+ 
315+ setup_cann_env
316+ install_python_deps
317+ 
318+ echo ""
319+ log_info "=========================================="
320+ log_info " Development environment ready!"
321+ log_info "=========================================="
322+ echo ""
323+ echo "Next steps:"
324+ echo " bash build.sh # Build project"
325+ echo " bash build.sh -u # Build and run UT"
326+ echo " bash build.sh -u --cov # Build with coverage"
327+ echo ""
328+}
329+ 
330+main "$@"