已合并
ops-math新增spack安装方式 #2585
moudi创建于 4月30日
ops-math新增spack安装方式 #2585
已合并
moudi创建于 4月30日
6 个文件变更+935-10
Mdocs/zh/install/compile.md+134-5
@@ -4,7 +4,7 @@
4 4 
5## 安装第三方依赖5## 安装第三方依赖
6 6 
7-> **说明**:对于WebIDEDocker环境,默认联网,编译过程中会自动下载第三方依赖,无需手动安装,可跳过本章操作。7+> **说明**:对于WebIDEDocker和Spack环境,默认联网,编译过程中会自动下载第三方依赖,无需手动安装,可跳过本章操作。
8 8 
9本项目编译过程依赖的第三方开源软件列表如下:9本项目编译过程依赖的第三方开源软件列表如下:
10 10 
@@ -40,7 +40,9 @@
40 40 
41若在有互联网的环境下编译,编译过程中会自动安装第三方依赖,无需手动安装。不同场景下源码编译和部署命令如下:41若在有互联网的环境下编译,编译过程中会自动安装第三方依赖,无需手动安装。不同场景下源码编译和部署命令如下:
42 42 
43-### 自定义算子包43+### 不使用Spack的场景
44+ 
45+#### 自定义算子包
44 46 
451. **编译自定义算子包**471. **编译自定义算子包**
46 48 
@@ -86,7 +88,7 @@
86 bash ${ASCEND_HOME_PATH}/opp/vendors/${vendor_name}_math/scripts/uninstall.sh88 bash ${ASCEND_HOME_PATH}/opp/vendors/${vendor_name}_math/scripts/uninstall.sh
87 ```89 ```
88 90 
89-### ops-math包91+#### ops-math包
90 92 
911. **编译ops-math包**931. **编译ops-math包**
92 94 
@@ -127,7 +129,7 @@
127 ./${install_path}/cann/share/info/ops_math/script/uninstall.sh129 ./${install_path}/cann/share/info/ops_math/script/uninstall.sh
128 ```130 ```
129 131 
130-### ops-math静态库132+#### ops-math静态库
131 133 
132> 说明:静态库仅支持Atlas A2、Atlas A3系列产品。experimental算子暂不支持使用静态库。134> 说明:静态库仅支持Atlas A2、Atlas A3系列产品。experimental算子暂不支持使用静态库。
133 135 
@@ -160,7 +162,134 @@
160 162 
161 \$\{static\_lib\_path\}表示静态库解压路径。解压后目录结构如下:163 \$\{static\_lib\_path\}表示静态库解压路径。解压后目录结构如下:
162 164 
163- ```text165+ ```
166+ ├── cann-${soc_name}-ops-math-static_${cann_version}_linux-${arch}
167+ │ ├── lib64
168+ │ │ ├── libcann_math_static.a # 静态库文件
169+ │ └── include
170+ | ├── ... # aclnn接口头文件
171+ ```
172+ 
173+### 使用Spack的场景
174+ 
175+#### 自定义算子包
176+ 
177+1. **编译自定义算子包**
178+ 
179+ 进入项目根目录,执行一键式脚本:
180+ 
181+ ```bash
182+ source prepare_cann_env.sh "cann-ops-math@{cann_version} +pkg soc=${soc_version} [vendor_name=${vendor_name}] [ops=${op_list}] [j=${n}]"
183+ # 以Abs算子编译为例
184+ # source prepare_cann_env.sh "cann-ops-math@master +pkg soc=ascend910b ops=abs j=16"
185+ # 编译experimental贡献目录下的用户算子(以Abs算子为例,编译时请以实际贡献算子为准)
186+ # source prepare_cann_env.sh "cann-ops-math@master +pkg +experimental soc=ascend910b ops=abs j=16"
187+ ```
188+ 
189+ - soc:\$\{soc\_version\}表示NPU型号。Atlas A2 训练系列产品/Atlas A2 推理系列产品使用"ascend910b"(默认),Atlas A3 训练系列产品/Atlas A3 推理系列产品使用"ascend910_93",Ascend 950PR/Ascend 950DT产品使用"ascend950"。
190+ - vendor_name(可选):\$\{vendor\_name\}表示构建的自定义算子包名,默认名为custom。
191+ - ops(可选):\$\{op\_list\}表示待编译算子,不指定时默认编译所有算子。格式形如"abs,add_lora,...",多算子之间用英文逗号","分隔。
192+ - experimental(可选):表示编译用户保存在experimental贡献目录下的算子。
193+ - j(可选):指定编译线程数,加快编译速度。
194+ 
195+ 若\$\{vendor\_name\}和\$\{op\_list\}都不传入编译的是ops-math包;若编译所有算子的自定义算子包,需传入\$\{vendor\_name\}。当提示如下信息,说明编译成功。
196+ 
197+ ```bash
198+ ==> cann-ops-math: Successfully installed cann-ops-math-master-xxxxxxxxxxxxxxxxx
199+ ```
200+ 
201+2. **查看产物位置**
202+ 
203+ 执行命令
204+ ```bash
205+ spack location -i cann-ops-math
206+ ```
207+ 此处产物指run包,实际上run包已自动安装到 `$ASCEND_HOME_PATH` 中,在代码根目录下的build_out目录下亦可找到run包
208+ 
209+3. **(可选)卸载自定义算子包。**
210+ 
211+ 自定义算子包安装后在```${ASCEND_HOME_PATH}/opp/vendors/${vendor_name}_math/scripts```目录会生成`uninstall.sh`,通过该脚本可卸载自定义算子包,命令如下:
212+ 
213+ ```bash
214+ bash ${ASCEND_HOME_PATH}/opp/vendors/${vendor_name}_math/scripts/uninstall.sh
215+ ```
216+ 
217+#### ops-math包
218+ 
219+1. **编译ops-math包**
220+ 
221+ 进入项目根目录,执行如下编译命令:
222+ 
223+ ```bash
224+ # 编译除experimental目录外的所有算子
225+ source prepare_cann_env.sh "cann-ops-math@{cann_version} +pkg soc=${soc_version} [j=${n}]"
226+ # 编译experimental目录下的所有算子
227+ # source prepare_cann_env.sh "cann-ops-math@master +pkg +experimental soc=ascend910b j=16"
228+ ```
229+ 
230+ - soc:\$\{soc\_version\}表示NPU型号。Atlas A2 训练系列产品/Atlas A2 推理系列产品使用"ascend910b"(默认),Atlas A3 训练系列产品/Atlas A3 推理系列产品使用"ascend910_93",Ascend 950PR/Ascend 950DT产品使用"ascend950"。
231+ - experimental(可选):表示编译用户保存在experimental目录下的算子。
232+ - j(可选):指定编译线程数,加快编译速度。
233+ 
234+ 若提示如下信息,说明编译成功。
235+ 
236+ ```bash
237+ ==> cann-ops-math: Successfully installed cann-ops-math-master-xxxxxxxxxxxxxxxxx
238+ ```
239+ 
240+2. **查看产物位置**
241+ 
242+ 执行命令
243+ ```bash
244+ spack location -i cann-ops-math
245+ ```
246+ 此处产物指run包,实际上run包已自动安装到 `$ASCEND_HOME_PATH` 中,在代码根目录下的build_out目录下亦可找到run包
247+ 
248+3. **(可选)卸载ops-math包**
249+ 
250+ ```bash
251+ # 卸载命令
252+ ./${install_path}/cann/share/info/ops_math/script/uninstall.sh
253+ ```
254+ 
255+#### ops-math静态库
256+ 
257+> 说明:静态库仅支持Atlas A2、Atlas A3系列产品。experimental算子暂不支持使用静态库。
258+ 
259+1. **编译ops-math静态库**
260+ 
261+ 进入项目根目录,执行如下编译命令:
262+ 
263+ ```bash
264+ source prepare_cann_env.sh "cann-ops-math@{cann_version} +pkg +static soc=${soc_version} [j=${n}]"
265+ ```
266+ 
267+ - soc:\$\{soc\_version\}表示NPU型号。Atlas A2系列产品使用"ascend910b"(默认),Atlas A3系列产品使用"ascend910_93"。
268+ - j(可选):指定编译线程数,加快编译速度。
269+ 若提示如下信息,说明编译并压缩成功。
270+ 
271+ ```bash
272+ ==> cann-ops-math: Successfully installed cann-ops-math-master-xxxxxxxxxxxxxxxxx
273+ ```
274+2. **查看产物位置**
275+ 
276+ 执行命令
277+ ```bash
278+ spack location -i cann-ops-math
279+ ```
280+ 此处产物指tar包,在代码根目录下的build_out目录下亦可找到tar包
281+ 
282+3. **解压ops-math静态库**
283+ 
284+ 进入build_out目录执行解压命令:
285+ 
286+ ```bash
287+ tar -zxvf ./cann-${soc_name}-ops-math-static_${cann_version}_linux-${arch}.tar.gz -C ${static_lib_path}
288+ ```
289+ 
290+ \$\{static\_lib\_path\}表示静态库解压路径。解压后目录结构如下:
291+ 
292+ ```
164 ├── cann-${soc_name}-ops-math-static_${cann_version}_linux-${arch}293 ├── cann-${soc_name}-ops-math-static_${cann_version}_linux-${arch}
165 │ ├── lib64294 │ ├── lib64
166 │ │ ├── libcann_math_static.a # 静态库文件295 │ │ ├── libcann_math_static.a # 静态库文件
Mdocs/zh/install/quick_install.md+41-5
@@ -16,6 +16,7 @@
16| WebIDE | 一站式开发平台,提供在线直接运行的昇腾环境,无需手动安装。<br>当前可提供单机算力,**默认安装最新商发版CANN包**。 | 适用于没有昇腾设备的开发者。|16| WebIDE | 一站式开发平台,提供在线直接运行的昇腾环境,无需手动安装。<br>当前可提供单机算力,**默认安装最新商发版CANN包**。 | 适用于没有昇腾设备的开发者。|
17| Docker | Docker镜像是一种高效部署方式,已预集成CANN包和必备依赖。<br>当前仅适用于Atlas A2系列产品,OS仅支持Ubuntu操作系统。**默认安装最新商发版CANN包**。 |适用有昇腾设备,需要快速搭建环境的开发者。|17| Docker | Docker镜像是一种高效部署方式,已预集成CANN包和必备依赖。<br>当前仅适用于Atlas A2系列产品,OS仅支持Ubuntu操作系统。**默认安装最新商发版CANN包**。 |适用有昇腾设备,需要快速搭建环境的开发者。|
18| 手动安装 | 手动安装CANN包和基础依赖,灵活性高。 |适用有昇腾设备,想体验手动安装CANN包或体验最新master分支能力的开发者。|18| 手动安装 | 手动安装CANN包和基础依赖,灵活性高。 |适用有昇腾设备,想体验手动安装CANN包或体验最新master分支能力的开发者。|
19+| Spack | 包管理工具,自动安装依赖并管理编译选项,支持一键式脚本或自定义配置。<br>**自动安装CANN包及编译依赖**(运行态需宿主机提前安装驱动与固件)。 | 适用有昇腾设备,需要自动化管理CANN包版本、编译选项及依赖,支持多配置与定制化构建的开发者(尤其适合HPC环境)。|
19 20 
20### 方式1:WebIDE环境21### 方式1:WebIDE环境
21 22 
@@ -164,6 +165,37 @@ docker run --name cann_container --device /dev/davinci0 --device /dev/davinci_ma
164 pip3 install -r requirements.txt165 pip3 install -r requirements.txt
165 ```166 ```
166 167 
168+### 方式4:Spack安装
169+ 
170+适用于希望快速安装依赖并灵活配置编译选项的开发者。Spack会自动安装CANN软件包(toolkit和ops)及编译依赖,运行态仍需宿主机提前安装驱动与固件(若仅编译算子可不安装)。
171+ 
172+#### 前置依赖
173+ 
174+尽管Spack会自动安装相关依赖,但是Spack依旧需要一些前置依赖来支持自身的运行:
175+- python >= 3.7.0(建议版本 <= 3.10)
176+- gcc >= 7.3.0
177+- patch
178+可自行手动安装,也可参考[安装基础依赖](./quick_install.md#安装基础依赖)
179+ 
180+#### 快速构建
181+ 
182+进入项目根目录,运行一键式脚本:
183+```bash
184+cd ${local_repo_path}/ops-math # ${local_repo_path}为本地代码仓的路径
185+source spack/prepare_cann_env.sh
186+spack install --add cann-ops@${cann_version} soc=${soc_name} # ops包是运行态依赖,若仅编译算子,可不安装此包。
187+```
188+prepare_cann_env.sh会自动安装Spack、搭建构建环境、拉取相关依赖并完成构建,构建场景默认为编译ops-math包,如需其他构建场景请参考[compile.md](./compile.md#使用Spack的场景)
189+ 
190+#### 产物位置
191+ 
192+**查看产物位置:**```spack location -i cann-ops-math```
193+此处产物指run包,实际上run包已自动安装到 `$ASCEND_HOME_PATH` 中,在代码根目录下的build_out目录下亦可找到run包
194+ 
195+#### 更多Spack操作
196+ 
197+如需更精细地使用Spack控制安装过程,请参考[spack_quick_install.md](./spack_quick_install.md)
198+ 
167## 环境验证199## 环境验证
168 200 
169安装完CANN包后,需验证环境和驱动是否正常。201安装完CANN包后,需验证环境和驱动是否正常。
@@ -178,15 +210,19 @@ docker run --name cann_container --device /dev/davinci0 --device /dev/davinci_ma
178- **检查CANN版本**210- **检查CANN版本**
179 211 
180 ```bash212 ```bash
181- # 查看CANN toolkit包版本信息(默认路径安装),WebIDE场景下将/usr/local替换为/home/developer213+ # 查看CANN toolkit包版本信息(默认路径安装)
182- cat /usr/local/Ascend/cann/${arch}-linux/ascend_toolkit_install.info214+ cat /usr/local/Ascend/cann/${arch}-linux/ascend_toolkit_install.info # docker部署和手动安装场景
183- # 查看CANN ops包版本信息(默认路径安装),WebIDE场景下将/usr/local替换为/home/developer215+ cat /home/developer/Ascend/cann/${arch}-linux/ascend_toolkit_install.info # WebIDE场景
184- cat /usr/local/Ascend/cann/${arch}-linux/ascend_ops_install.info216+ spack location -i cann-toolkit # Spack安装场景
217+ # 查看CANN ops包版本信息(默认路径安装)
218+ cat /usr/local/Ascend/cann/${arch}-linux/ascend_ops_install.info # docker部署和手动安装场景
219+ cat /home/developer/Ascend/cann/${arch}-linux/ascend_ops_install.info # WebIDE场景
220+ spack location -i cann-ops # Spack安装场景
185 ```221 ```
186 222 
187## 环境变量配置223## 环境变量配置
188 224 
189-按需选择合适的命令使环境变量生效225+按需选择合适的命令使环境变量生效,Spack场景下已自动设置环境变量,跳过此步骤
190 226 
191```bash227```bash
192# 默认路径安装,以root用户为例(非root用户,将/usr/local替换为${HOME})228# 默认路径安装,以root用户为例(非root用户,将/usr/local替换为${HOME})
Adocs/zh/install/spack_quick_install.md+301-0
@@ -0,0 +1,301 @@
1+# 使用Spack快速搭建开发环境
2+ 
3+针对新加入的开发人员,可以根据以下步骤快速搭建开发环境
4+ 
5+## 一、本地快速构建
6+ 
7+### 1.本地快速搭建环境并构建
8+ 
9+#### 方法一、运行一键式脚本快速构建
10+prepare_cann_env.sh会一键式搭建Spack环境并安装ops-math的全部依赖
11+```bash
12+# 进入代码根目录
13+cd ${local_repo_path}/ops-math
14+source spack/prepare_cann_env.sh
15+```
16+#### 方法二、手动配置环境(适合高级用户或自定义配置)
17+ 
18+如果您希望更精细地控制环境配置,可以按照以下步骤手动配置:
19+ 
20+##### 步骤 1:下载并安装 Spack(Spack已安装可跳过)
21+ 
22+```bash
23+# 选择安装目录(默认为 $HOME)
24+export SPACK_INSTALL_DIR="$HOME"
25+# 下载 Spack v1.1.0 并激活 Spack 工具
26+cd $SPACK_INSTALL_DIR
27+git clone https://gitcode.com/GitHub_Trending/sp/spack.git -b v1.1.0 --depth=2
28+source $SPACK_INSTALL_DIR/spack/share/spack/setup-env.sh
29+# 验证 Spack 安装后的版本
30+spack --version
31+```
32+ 
33+##### 步骤 2:设置Spack 软件包默认安装路径
34+ 
35+Spack软件包默认安装路径在$SPACK_INSTALL_DIR/spack/opt,可以通过如下命令进行修改:
36+ 
37+```bash
38+#普通用户
39+spack config --scope user add "config:install_tree:root:$HOME/.spack"
40+#root 管理员
41+spack config --scope user add "config:install_tree:root:/opt/spack"
42+```
43+ 
44+普通用户建议使用个人home下目录,避免被其他用户修改导致环境不稳定
45+管理员建议使用全局路径,便于使用[Spack串联能力](https://spack.readthedocs.io/en/latest/chain.html)统一安装软件提供给其他用户使用:
46+ 
47+##### 步骤 3:添加外部已安装工具到Spack环境中
48+ 
49+```bash
50+spack compiler find # 配置本地已安装的编译器,如gcc
51+```
52+ 
53+##### 步骤 4:配置 Spack 官方仓库gitcode镜像源
54+ 
55+Spack默认官方仓库地址为[github地址](https://github.com/spack/spack-packages.git),可以通过如下方式修改默认官方仓库,使用GitCode镜像源起到加速作用:
56+修改~/.spack目录下的repos.yaml,如不存在则新建该文件,写入以下内容
57+ 
58+```yaml
59+repos:
60+ # Spack 内置仓库
61+ builtin:
62+ git: https://gitcode.com/spack/spack-packages.git
63+ branch: releases/v2025.11
64+```
65+ 
66+验证仓库配置:`spack repo list`
67+ 
68+##### 步骤 5:下载并添加 CANN社区Spack 包仓库
69+ 
70+```bash
71+# 克隆 CANN Spack 包仓库
72+cd $SPACK_INSTALL_DIR
73+git clone --depth=1 https://gitcode.com/cann/cann-spack-package.git
74+ 
75+# 添加到 Spack 仓库列表
76+spack repo add $SPACK_INSTALL_DIR/cann-spack-package
77+ 
78+# 验证添加成功
79+spack repo list | grep cann
80+```
81+ 
82+##### 步骤 6:创建并激活 Spack 环境
83+ 
84+```bash
85+# 创建名为 cann-dev-env 的环境
86+spack env create cann-dev-env ${local_repo_path}/ops-math/spack/spack.yaml
87+ 
88+# 激活环境
89+spack env activate cann-dev-env
90+ 
91+# 验证环境激活
92+spack env status
93+```
94+ 
95+##### 步骤 7:设置终端自动加载(可选)
96+ 
97+```bash
98+# 将 Spack 环境配置添加到 .bashrc
99+echo "source $SPACK_INSTALL_DIR/spack/share/spack/setup-env.sh" >> ~/.bashrc
100+ 
101+# 立即生效
102+source ~/.bashrc
103+```
104+ 
105+##### 步骤 8:配置开发模式并安装
106+ 
107+```bash
108+# 设置 ops-math 为开发模式(指向本地代码)
109+spack develop -p ${local_repo_path}/ops-math cann-ops-math@master
110+ 
111+# 添加包到环境(根据需要调整变体)
112+spack add cann-ops-math@master+pkg+jit
113+ 
114+# 解析依赖关系
115+spack concretize -f
116+ 
117+# 安装
118+spack install
119+```
120+ 
121+### 2. 查看产物位置
122+ 
123+执行命令
124+ 
125+```bash
126+spack location -i cann-ops-math
127+```
128+ 
129+即可查看ops-math编译生成run包的位置,run包已自动安装到ASCEND_HOME_PATH下
130+ 
131+## 二、修改代码后重新构建
132+ 
133+### 1. 卸载已构建的产物
134+```bash
135+spack uninstall -y cann-ops-math
136+```
137+### 2. 移除已有变体并添加新变体
138+ 
139+如果想指定不同的构建参数,可通过更换Spack包变体来实现
140+(不更改构建参数,可跳过此步骤)
141+```bash
142+spack change cann-ops-math@master +pkg +jit soc=ascend910b # 举例
143+```
144+### 3. 重新进行依赖解析
145+```bash
146+spack concretize -f
147+```
148+### 4. 重新构建
149+```bash
150+spack install
151+```
152+## 三、重新进入Spack环境
153+ 
154+开启新终端需要重新进入Spack环境
155+```bash
156+spack env activate cann-dev-env
157+```
158+## 四、清理环境或卸载Spack
159+ 
160+如果不想继续使用Spack,可使用`prepare_cann_env.sh`的clean参数卸载Spack并通过**重启终端**来清理环境变量
161+```bash
162+source prepare_cann_env.sh clean
163+```
164+ 
165+## 五、ops-math的Spack构建变体
166+ 
167+通过`spack info cann-ops-math`命令可以查看ops-math支持的参数,变体具体含义请参考[build.md](./build.md#参数说明).
168+ 
169+ 
170+## 六、Spack开发与调试命令指导
171+ 
172+```shell
173+#查看当前环境列表:如果是从一键式脚本prepare_cann_env.sh生成,已准备好开发环境cann-dev-env
174+spack env list
175+ 
176+#创建环境:Spack管理的环境之间互相隔离,以链接的形式与软件包关联
177+spack env create <env-name>
178+ 
179+#启用环境:当前激活的环境字体为绿色,Spack的命令以当前激活环境为准,与所处位置无关
180+spack env activate <env-name>
181+ 
182+#查看当前环境中都引入了哪些软件包:如果不在特定环境中执行则为查看所有环境
183+spack find #列出所有软件包
184+spack find -L #显示完整哈希
185+spack find <package-name> #按包名过滤,不提供则为全部包
186+spack find --deps <package-name> #显示该包的依赖树
187+spack find --explicit <package-name> #显示手动安装的定级包 缩写:-e
188+spack find -p <package-name> #显示完整安装路径
189+spack find -lv <package-name> #显示完整哈希和变体信息
190+ 
191+#向当前环境中添加软件包:
192+spack add <package-name> #同样支持spec语法,指定版本,变体,编译器等
193+ 
194+#从当前环境中移除软件包: Spack不会删除软件包,只是移除当前环境与软件包之间的依赖
195+spack remove <package-name>
196+ 
197+#卸载软件包:需要所有的Spack环境都不依赖该软件包才可以由Spack卸载,会卸载本地安装好的包,慎用
198+spack uninstall <package-name>
199+ 
200+#删除某个Spack环境:物理删除文件,慎用
201+spack env remove <env-name>
202+ 
203+#取消激活当前环境:
204+spack env deactivate
205+ 
206+#搜索Spack支持的软件包
207+spack list <package-name>
208+spack list 'py-*' #列出所有 Python 包
209+spack list -d 'mpi' #在描述中搜索 mpi
210+ 
211+#查看可用版本号
212+spack versions <package-name>
213+ 
214+#清除Spack构建缓存:
215+spack clean
216+spack clean -all #将旧源码与旧构建记录及缓存全部清除,慎用
217+ 
218+#查看当前软件包信息:查看该软件包所有支持的版本,Spack默认倾向于最新版本
219+spack info <package-name>
220+ 
221+#安装软件包,Spack自动选择最新版本
222+spack install #安装当前环境中所有未安装的软件包
223+spack install <package-name> #指定具体的软件包名
224+spack install <package-name>@1.12.0%gcc@11.4.0 #spec语法,指定版本与编译器版本
225+spack install <package-name>+mpi+fortran ^openmpi@4.1 #spec语法,指定变体
226+spack install <package-name1> <package-name2> <package-name3> #同时安装多个包
227+spack -k install #安装时跳过安全认证,慎用
228+spack install --verbose #输出详细构建日志,缩写:-v
229+spack install --no-checksum #安装时禁用网络校验和检查,慎用
230+ 
231+#具体化当前环境:Spack的策略是默认倾向于重用已安装在本地的软件包,即使已有更高版本且满足依赖条件,除非本地包已不符合依赖条件
232+spack concretize
233+ 
234+#从远端下载软件包源码到本地并注册为开发包:否则Spack引用的远端文件会作为缓存临时文件,会被spack clean清除
235+spack develop <package-name>
236+ 
237+#从本地代码开发目录注册开发包
238+git clone <git-path> #克隆源码并进入目录
239+cd /package/path
240+spack develop --no-clone <package-name>
241+ 
242+#解析该软件包依赖信息:
243+spack spec <package-name>
244+ 
245+# 如果git仓有更新,该命令可以根据repos.yaml中配置的远程仓库地址与分支进行同步更新
246+spack repo update <repo name>
247+ 
248+#定位软件包安装位置:
249+spack location -b <package-name>
250+ 
251+#查看编译器配置:
252+spack compilers #查看所有支持的编译器,同spack compiler list
253+spack compiler add /path/to/compiler/bin #手动添加编译器
254+ 
255+#查看Spack复用的本机已安装的软件
256+spack external find
257+ 
258+#查看Spack版本,验证安装:
259+spack --version
260+ 
261+#编辑Spack配置: 会自动打开vim
262+spack config edit config
263+spack config edit packages
264+```
265+ 
266+## 七、一键式脚本prepare_cann_env.sh生成路径(默认)
267+ 
268+```shell
269+#cann开源仓目录:
270+$HOME/cann-spack-package
271+ 
272+#Spack管理的软件包安装目录:
273+root用户:/opt/spack/linux-*
274+普通用户:$HOME/.spack/linux-*
275+ 
276+#Spack配置目录:
277+$HOME/.spack
278+ 
279+#Spack自身提供的builtin软件包目录:
280+$HOME/.spack/package_repos/opgus4u/repos/spack_repo/builtin/packages
281+ 
282+#Spack本体目录:
283+$HOME/spack
284+ 
285+#Spack环境目录:
286+$HOME/spack/var/spack/environments
287+```
288+## 八、FAQ
289+ 
290+### 1.执行prepare_cann_env.sh出现报错怎么办
291+如果机器在以前安装过Spack可能会导致环境变量或配置文件残留,可在备份关键数据后执行```source prepare_cann_env.sh clean```并重启终端后重新执行
292+ 
293+### 2.安装过程中出现ssl类报错怎么办
294+此类报错是由于机器缺少相关证书导致,请自行配置证书并重新运行
295+ 
296+### 3.不想使用Spack了如何卸载
297+执行```source prepare_cann_env.sh clean```可自动卸载Spack,root用户还需要执行```rm -rf /opt/spack```卸载所有Spack软件包
298+ 
299+## 九、更多Spack操作请参考官方文档
300+ 
301+https://spack.readthedocs.io/en/latest/
Aspack/prepare_cann_env.sh+421-0
@@ -0,0 +1,421 @@
1+#!/bin/bash
2+# Copyright (c) 2026 Huawei Technologies Co., Ltd.
3+# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4+# CANN Open Software License Agreement Version 2.0 (the "License").
5+# Please refer to the License for details. You may not use this file except in compliance with the License.
6+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7+# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8+# See LICENSE in the root of the software repository for the full text of the License.
9+# ============================================================================
10+ 
11+#set -e # 如果启用,脚本会在任何命令返回非零状态时立即退出
12+original_umask=$(umask)
13+umask 0022 # cann-toolkit安装时会检验父目录权限,需要权限为755才可成功安装
14+restore_umask() {
15+ echo "$original_umask"
16+ umask $original_umask
17+}
18+# 记录当前脚本的路径,用于后续的相对路径计算
19+script_path="${BASH_SOURCE[0]}"
20+script_dir="$(cd "$(dirname "$script_path")" && pwd)"
21+develop_path="$script_dir/.."
22+ 
23+# 包名定义,遵循规范:cann-组件名@版本号 +变体
24+# 默认值(无参数时使用)
25+DEFAULT_PACKAGE_NAME="cann-ops-math@master +pkg"
26+# 最终使用的包名,会在参数解析后确定
27+PACKAGE_NAME="$DEFAULT_PACKAGE_NAME"
28+ 
29+# Spack 安装目录,默认安装在用户家目录下
30+SPACK_INSTALL_DIR="$HOME"
31+# Spack 环境名称,可以自定义
32+ENV_NAME="cann-dev-env"
33+ 
34+# repos.yaml 配置文件的路径
35+REPOS_YAML_DOWNLOAD_PATH="$script_dir/repos.yaml"
36+ 
37+# CANN Spack 包仓库地址(请根据实际情况修改为开源仓库地址)
38+CANN_PACKAGES_REPO_URL="https://gitcode.com/cann/cann-spack-package.git"
39+ 
40+# 检查 Git 是否已安装,Spack 依赖于 Git 进行源码管理
41+check_git() {
42+ if ! git --version > /dev/null 2>&1; then
43+ echo "❌ 错误:未检测到 Git 安装"
44+ echo " 在使用 Spack 之前,请先安装 Git"
45+ echo " 例如在 Ubuntu/Debian 系统上可以使用:sudo apt-get install git"
46+ echo "false"
47+ return
48+ fi
49+ echo "✅ Git 已安装"
50+}
51+ 
52+# 检查、下载并激活 Spack
53+check_and_install_and_activate_spack() {
54+ local spack_dir="$SPACK_INSTALL_DIR/"
55+ local setup_script="$spack_dir/spack/share/spack/setup-env.sh"
56+
57+ echo "🔍 检查 Spack 安装状态..."
58+
59+ if [ ! -f "$setup_script" ]; then
60+ echo "📥 未检测到 Spack,开始下载 Spack v1.1.0..."
61+ cd "$SPACK_INSTALL_DIR"
62+ if [ ! -d "$SPACK_INSTALL_DIR/spack" ]; then
63+ git clone https://gitcode.com/GitHub_Trending/sp/spack.git -b v1.1.0 --depth=2
64+ if [ $? -ne 0 ]; then
65+ echo "❌ 错误:Spack 下载失败,请检查网络连接"
66+ return 1 2>/dev/null || exit 1
67+ fi
68+ echo "✅ Spack 下载完成"
69+ fi
70+ else
71+ echo "✅ Spack 已存在,跳过下载"
72+ fi
73+ 
74+ echo "🔧 激活 Spack 环境..."
75+ . "$setup_script"
76+
77+ if ! spack --version > /dev/null 2>&1; then
78+ echo "❌ 错误:Spack 激活失败,请检查安装"
79+ return 1 2>/dev/null || exit 1
80+ fi
81+
82+ echo "✅ Spack 环境激活成功"
83+ echo " Spack 版本:$(spack --version | head -n1)"
84+}
85+ 
86+# 创建 Spack 环境并激活
87+create_spack_env_and_activate() {
88+ local spack_dir="$SPACK_INSTALL_DIR/spack"
89+ local env_name="$ENV_NAME"
90+ local dir_environment="$spack_dir/var/spack/environments/$env_name"
91+ local spack_buitin_repo="$SPACK_INSTALL_DIR/.spack/package_repos/ughgqqd/spack-repo-index.yaml"
92+ 
93+ echo "🔧 正在创建 Spack 环境:$env_name"
94+
95+ # 如果因网络问题下载仓库失败会导致生成空目录,导致第二次git clone失败,检测仓库目录是否为空,如果为空则删除
96+ if [ ! -d "$spack_buitin_repo" ]; then
97+ rm -rf "$SPACK_INSTALL_DIR/.spack/package_repos"
98+ fi
99+ 
100+ # 使用 spack.yaml 配置文件创建环境
101+ if [ ! -d "$dir_environment" ]; then
102+ spack env create "$env_name" "$script_dir/spack.yaml"
103+ if [ $? -ne 0 ]; then
104+ echo "❌ 错误:创建 Spack 环境失败"
105+ return 1 2>/dev/null || exit 1
106+ fi
107+ echo "✅ Spack 环境创建成功"
108+ else
109+ echo "ℹ️ Spack 环境 '$env_name' 已存在,跳过创建"
110+ fi
111+ 
112+ # 激活 Spack 环境
113+ echo "🔧 正在激活 Spack 环境:$env_name"
114+ spack env activate "$env_name"
115+ if [ $? -ne 0 ]; then
116+ echo "❌ 错误:激活 Spack 环境失败"
117+ return 1 2>/dev/null || exit 1
118+ fi
119+
120+ # 查找并配置编译器
121+ echo "🔧 正在查找并配置可用编译器..."
122+ spack compiler find
123+
124+ #配置并信任官方证书
125+ #echo "🔧 正在设置并信任官方二进制包(Buildcache)的 GPG 签名密钥..."
126+ #spack buildcache keys --install --trust
127+ 
128+
129+ echo "✅ Spack 环境 '$env_name' 已激活并准备就绪"
130+}
131+ 
132+# 配置 Spack 的软件包安装目录到用户目录
133+add_user_spack_config() {
134+ echo "⚙️ 配置 Spack 用户级安装路径..."
135+
136+ CURRENT_USER=$(whoami)
137+ if [ "$CURRENT_USER" = "root" ]; then
138+ # 管理员路径(全局共享目录)
139+ local SPACK_PACKAGES_INSTALL_DIR="/opt/spack"
140+ echo "⚠️ 检测到 root 用户,将使用全局安装目录:$SPACK_PACKAGES_INSTALL_DIR"
141+ else
142+ # 普通用户路径(用户家目录)
143+ local SPACK_PACKAGES_INSTALL_DIR="$HOME/.spack"
144+ echo " 将使用用户级安装目录:$SPACK_PACKAGES_INSTALL_DIR"
145+ fi
146+
147+ spack config --scope user add "config:install_tree:root:$SPACK_PACKAGES_INSTALL_DIR"
148+ echo "✅ Spack 安装路径配置完成"
149+}
150+ 
151+# 配置 Spack 仓库(repos.yaml)
152+copy_spack_repos_yaml() {
153+ echo "⚙️ 配置 Spack 仓库..."
154+
155+ # 确保 ~/.spack 目录存在
156+ mkdir -p ~/.spack
157+ cd ~/.spack
158+ 
159+ if [ -f repos.yaml ]; then
160+ echo "ℹ️ 检测到 repos.yaml 已存在,跳过配置"
161+ return
162+ fi
163+ 
164+ if [ ! -f "$script_dir/repos.yaml" ]; then
165+ echo "⚠️ 警告:未找到 repos.yaml 配置文件"
166+ echo " 请确保 $script_dir/repos.yaml 文件存在"
167+ return
168+ fi
169+ 
170+ echo "📄 复制 repos.yaml 到 ~/.spack 目录"
171+ cp "$script_dir/repos.yaml" .
172+
173+ if ! spack repo list > /dev/null 2>&1; then
174+ echo "❌ 错误:Spack 仓库配置失败"
175+ return 1 2>/dev/null || exit 1
176+ fi
177+
178+ echo "✅ Spack 仓库配置完成"
179+}
180+ 
181+# 下载 CANN Spack 包仓库
182+download_cann_repo() {
183+ echo "📥 正在下载 CANN Spack 包仓库..."
184+
185+ cd $SPACK_INSTALL_DIR
186+ if [ ! -d cann-spack-package ]; then
187+ echo " 从 $CANN_PACKAGES_REPO_URL 下载仓库..."
188+ git clone --depth=1 $CANN_PACKAGES_REPO_URL
189+ if [ $? -ne 0 ]; then
190+ echo "❌ 错误:CANN Spack 包仓库下载失败"
191+ echo " 请检查:"
192+ echo " 1. 网络连接"
193+ echo " 2. 仓库地址是否正确"
194+ echo " 3. 是否有访问权限"
195+ return 1 2>/dev/null || exit 1
196+ fi
197+ echo "✅ CANN Spack 包仓库下载完成"
198+ else
199+ echo "ℹ️ CANN Spack 包仓库已存在,跳过下载"
200+ fi
201+ 
202+ # 将仓库添加到 Spack
203+ if spack repo list | grep -q "cann-spack-package"; then
204+ echo "ℹ️ CANN Spack 包仓库已添加,跳过添加"
205+ return
206+ fi
207+
208+ echo "🔗 将 CANN 仓库添加到 Spack..."
209+ spack repo add "$SPACK_INSTALL_DIR/cann-spack-package"
210+ if [ $? -ne 0 ]; then
211+ echo "❌ 错误:添加仓库失败"
212+ return 1 2>/dev/null || exit 1
213+ fi
214+ echo "✅ CANN Spack 包仓库添加完成"
215+}
216+ 
217+# 将 Spack 环境配置添加到 .bashrc,实现终端启动时自动加载
218+add_spack_env_to_bashrc() {
219+ echo "⚙️ 配置终端自动加载 Spack 环境..."
220+
221+ target_line="source $SPACK_INSTALL_DIR/spack/share/spack/setup-env.sh"
222+
223+ # 检查是否已配置
224+ if ! grep -qF "$target_line" ~/.bashrc; then
225+ # 如果不存在则追加
226+ echo "$target_line" >> ~/.bashrc
227+ echo "✅ 已添加 Spack 环境配置到 ~/.bashrc"
228+ echo " 下次打开终端时会自动加载 Spack 环境"
229+ else
230+ echo "ℹ️ Spack 环境配置已存在,无需添加"
231+ fi
232+
233+ # 立即生效(仅当前会话)
234+ echo "🔄 立即应用配置..."
235+ source ~/.bashrc
236+ echo "✅ 配置已完成"
237+ echo " Spack 安装目录:$SPACK_INSTALL_DIR/spack"
238+}
239+ 
240+# 将本地代码仓库设置为开发分支,并安装所有依赖
241+pull_develop_branch_local() {
242+ echo "🔧 设置 $PACKAGE_NAME 为开发模式..."
243+
244+ # 将本地路径设置为开发分支
245+ spack develop -p $develop_path "$PACKAGE_NAME"
246+ if [ $? -ne 0 ]; then
247+ echo "❌ 错误:设置开发模式失败"
248+ return 1 2>/dev/null || exit 1
249+ fi
250+
251+ echo "✅ $PACKAGE_NAME 已设置为开发模式"
252+ echo " 源代码路径:$develop_path"
253+
254+ # 添加包到环境
255+ echo "📦 添加 $PACKAGE_NAME 到当前环境..."
256+ spack add "$PACKAGE_NAME"
257+
258+ # 解决依赖关系
259+ echo "🔍 解析依赖关系..."
260+ spack concretize -f
261+ if [ $? -ne 0 ]; then
262+ echo "❌ 错误:解析依赖关系失败,请确认环境中是否存在依赖版本冲突"
263+ return 1 2>/dev/null || exit 1
264+ fi
265+ # 开始安装
266+ echo "📥 正在安装(这可能需要一些时间)..."
267+ spack install
268+ if [ $? -ne 0 ]; then
269+ echo "❌ 错误:安装失败,请查看日志确认失败原因"
270+ return 1 2>/dev/null || exit 1
271+ fi
272+ 
273+ echo "✅ 安装完成!"
274+ echo ""
275+ echo "📝 常用命令:"
276+ echo " 查看环境状态:spack find"
277+ echo " 重新激活环境:spack env activate $ENV_NAME"
278+ echo " 退出当前环境:spack env deactivate"
279+}
280+ 
281+# 清理 Spack 环境(用于卸载)
282+environment_clean() {
283+ echo "🧹 开始清理 Spack 环境..."
284+ echo "⚠️ 警告:此操作将删除所有 Spack 相关文件和配置"
285+ echo " 包括:"
286+ echo " - 所有已安装的软件包"
287+ echo " - Spack 本身"
288+ echo " - 所有配置文件"
289+ echo ""
290+ read -p " 确定要继续吗?(y/N): " confirm
291+
292+ if [[ ! $confirm =~ ^[Yy]$ ]]; then
293+ echo "❌ 操作已取消"
294+ return 0 2>/dev/null || exit 0
295+ fi
296+
297+ echo "正在清理..."
298+
299+ # 删除 Spack 相关目录
300+ rm -rf ~/.spack
301+ rm -rf "$SPACK_INSTALL_DIR/spack"
302+ rm -rf "$SPACK_INSTALL_DIR/spack-repo"
303+ rm -rf "$SPACK_INSTALL_DIR/spack-packages-develop"
304+ rm -rf "$SPACK_INSTALL_DIR/cann-spack-package"
305+
306+ # 显示清理后的目录
307+ echo "✅ 清理完成,剩余文件:"
308+ ls -al $SPACK_INSTALL_DIR
309+
310+ # 从 .bashrc 中移除 Spack 配置
311+ sed -i "\|^source $SPACK_INSTALL_DIR/spack/share/spack/setup-env.sh$|d" ~/.bashrc
312+ echo "✅ 已从 ~/.bashrc 中移除 Spack 配置"
313+
314+ echo ""
315+ echo "🎉 所有 Spack 相关文件已清理完成!"
316+ echo " 注意:可能存在环境变量残留,需要重启终端以清理环境变量"
317+}
318+ 
319+# 显示帮助信息
320+show_help() {
321+ echo "🔧 CANN 开发环境准备脚本"
322+ echo ""
323+ echo "使用方法:"
324+ echo " $0 [选项] [包名]"
325+ echo ""
326+ echo "选项:"
327+ echo " clean - 清理并卸载所有 Spack 相关文件和配置"
328+ echo " help - 显示此帮助信息"
329+ echo ""
330+ echo "参数:"
331+ echo " 包名 - 指定要使用的 CANN 包名(包含版本和变体)"
332+ echo " 例如:cann-ops-math@master +pkg +jit"
333+ echo " 如果不指定,默认使用:$DEFAULT_PACKAGE_NAME"
334+ echo ""
335+ echo "功能说明:"
336+ echo " 本脚本将自动完成以下操作:"
337+ echo " 1. 检查并安装 Git(如果未安装)"
338+ echo " 2. 下载并安装 Spack"
339+ echo " 3. 配置 Spack 仓库"
340+ echo " 4. 下载 CANN Spack 包仓库"
341+ echo " 5. 创建并激活 CANN 开发环境"
342+ echo " 6. 将 Spack 添加到终端自动加载"
343+ echo " 7. 设置当前目录为开发分支并安装所有依赖"
344+ echo ""
345+ echo "环境变量:"
346+ echo " ENV_NAME - Spack 环境名称(默认:cann-dev-env)"
347+ echo " SPACK_INSTALL_DIR - Spack 安装目录(默认:$HOME)"
348+ echo ""
349+ echo "示例:"
350+ echo " # 安装开发环境"
351+ echo " $0"
352+ echo ""
353+ echo " # 清理环境"
354+ echo " $0 clean"
355+}
356+ 
357+# 主函数
358+main() {
359+ echo "========================================="
360+ echo "🔧 CANN 开发环境配置工具"
361+ echo "========================================="
362+
363+ # 显示环境信息
364+ echo "📋 环境配置:"
365+ echo " - 环境名称:$ENV_NAME"
366+ echo " - Spack 目录:$SPACK_INSTALL_DIR"
367+ echo " - 包名称:$PACKAGE_NAME"
368+ echo "========================================="
369+
370+ # 检查 Git
371+ check_git
372+
373+ # 安装并激活 Spack
374+ check_and_install_and_activate_spack
375+
376+ # 配置仓库
377+ copy_spack_repos_yaml
378+ download_cann_repo
379+
380+ # 配置用户安装路径
381+ add_user_spack_config
382+
383+ # 创建并激活环境
384+ create_spack_env_and_activate
385+
386+ # 配置终端自动加载
387+ add_spack_env_to_bashrc
388+
389+ # 设置开发分支并安装依赖
390+ pull_develop_branch_local
391+
392+ echo ""
393+ echo "========================================="
394+ echo "🎉 CANN 开发环境配置完成!"
395+ echo "========================================="
396+ echo ""
397+ echo "💡 提示:Spack 环境已添加到 .bashrc,下次打开终端会自动加载"
398+ echo ""
399+}
400+ 
401+# 命令行参数处理
402+case "$1" in
403+ clean)
404+ environment_clean
405+ ;;
406+ help|--help|-h)
407+ show_help
408+ ;;
409+ "")
410+ # 无参数:使用默认包名
411+ PACKAGE_NAME="$DEFAULT_PACKAGE_NAME"
412+ main
413+ ;;
414+ *)
415+ # 其他参数:视为自定义包名
416+ PACKAGE_NAME="$1"
417+ main
418+ ;;
419+esac
420+restore_umask
421+cd $develop_path
Aspack/repos.yaml+15-0
@@ -0,0 +1,15 @@
1+# -----------------------------------------------------------------------------------------------------------
2+# Copyright (c) 2026 Huawei Technologies Co., Ltd.
3+# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4+# CANN Open Software License Agreement Version 2.0 (the "License").
5+# Please refer to the License for details. You may not use this file except in compliance with the License.
6+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7+# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8+# See LICENSE in the root of the software repository for the full text of the License.
9+# -----------------------------------------------------------------------------------------------------------
10+ 
11+repos:
12+ # Spack 内置仓库
13+ builtin:
14+ git: https://gitcode.com/spack/spack-packages.git
15+ branch: releases/v2025.11
Aspack/spack.yaml+23-0
@@ -0,0 +1,23 @@
1+# -----------------------------------------------------------------------------------------------------------
2+# Copyright (c) 2026 Huawei Technologies Co., Ltd.
3+# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4+# CANN Open Software License Agreement Version 2.0 (the "License").
5+# Please refer to the License for details. You may not use this file except in compliance with the License.
6+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7+# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8+# See LICENSE in the root of the software repository for the full text of the License.
9+# -----------------------------------------------------------------------------------------------------------
10+ 
11+spack:
12+ view: true
13+ concretizer:
14+ unify: true
15+ #mirrors:
16+ # remote_binary:
17+ # url: https://mirrors.huaweicloud.com/artifactory/cann-spark/buildcache
18+ # binary: true
19+ # source: false
20+ # remote_source:
21+ # url: https://mirrors.huaweicloud.com/artifactory/cann-spark
22+ # binary: false
23+ # source: true