已合并
ops-math新增spack安装方式 #2585
moudi创建于 4月30日
ops-math新增spack安装方式 #2585
已合并
共 6 个文件变更+935-10
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | ## 安装第三方依赖 | 5 | ## 安装第三方依赖 |
| 6 | 6 | ||
| 7 | -> **说明**:对于WebIDE或Docker环境,默认联网,编译过程中会自动下载第三方依赖,无需手动安装,可跳过本章操作。 | 7 | +> **说明**:对于WebIDE、Docker和Spack环境,默认联网,编译过程中会自动下载第三方依赖,无需手动安装,可跳过本章操作。 |
| 8 | 8 | ||
| 9 | 本项目编译过程依赖的第三方开源软件列表如下: | 9 | 本项目编译过程依赖的第三方开源软件列表如下: |
| 10 | 10 | ||
| @@ -40,7 +40,9 @@ | |||
| 40 | 40 | ||
| 41 | 若在有互联网的环境下编译,编译过程中会自动安装第三方依赖,无需手动安装。不同场景下源码编译和部署命令如下: | 41 | 若在有互联网的环境下编译,编译过程中会自动安装第三方依赖,无需手动安装。不同场景下源码编译和部署命令如下: |
| 42 | 42 | ||
| 43 | -### 自定义算子包 | 43 | +### 不使用Spack的场景 |
| 44 | + | ||
| 45 | +#### 自定义算子包 | ||
| 44 | 46 | ||
| 45 | 1. **编译自定义算子包** | 47 | 1. **编译自定义算子包** |
| 46 | 48 | ||
| @@ -86,7 +88,7 @@ | |||
| 86 | bash ${ASCEND_HOME_PATH}/opp/vendors/${vendor_name}_math/scripts/uninstall.sh | 88 | bash ${ASCEND_HOME_PATH}/opp/vendors/${vendor_name}_math/scripts/uninstall.sh |
| 87 | ``` | 89 | ``` |
| 88 | 90 | ||
| 89 | -### ops-math包 | 91 | +#### ops-math包 |
| 90 | 92 | ||
| 91 | 1. **编译ops-math包** | 93 | 1. **编译ops-math包** |
| 92 | 94 | ||
| @@ -127,7 +129,7 @@ | |||
| 127 | ./${install_path}/cann/share/info/ops_math/script/uninstall.sh | 129 | ./${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 | - ```text | 165 | + ``` |
| 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 | │ ├── lib64 | 294 | │ ├── lib64 |
| 166 | │ │ ├── libcann_math_static.a # 静态库文件 | 295 | │ │ ├── libcann_math_static.a # 静态库文件 |
| @@ -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.txt | 165 | 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 | ```bash | 212 | ```bash |
| 181 | - # 查看CANN toolkit包版本信息(默认路径安装),WebIDE场景下将/usr/local替换为/home/developer | 213 | + # 查看CANN toolkit包版本信息(默认路径安装) |
| 182 | - cat /usr/local/Ascend/cann/${arch}-linux/ascend_toolkit_install.info | 214 | + cat /usr/local/Ascend/cann/${arch}-linux/ascend_toolkit_install.info # docker部署和手动安装场景 |
| 183 | - # 查看CANN ops包版本信息(默认路径安装),WebIDE场景下将/usr/local替换为/home/developer | 215 | + cat /home/developer/Ascend/cann/${arch}-linux/ascend_toolkit_install.info # WebIDE场景 |
| 184 | - cat /usr/local/Ascend/cann/${arch}-linux/ascend_ops_install.info | 216 | + 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 | ```bash | 227 | ```bash |
| 192 | # 默认路径安装,以root用户为例(非root用户,将/usr/local替换为${HOME}) | 228 | # 默认路径安装,以root用户为例(非root用户,将/usr/local替换为${HOME}) |
| @@ -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/ | ||
| @@ -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 | ||
| @@ -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 | ||
| @@ -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 | ||