源码编译安装MindSpore

242 阅读3分钟

(之前是把文章发到CSDN上的,后来发现这网站僵尸粉太多了,于是转战掘金)

想研究MindSpore的C++后端代码,自然需要自己基于源码编译出版本(例如,在代码中加日志确认程序执行流程等),记录一下整个过程:

一.环境准备

我是在windows机器上装的VMware,在VMware安装Ubuntu24.04.01,然后在Ubuntu中进行后续操作。

硬件环境准备

初次编译MindSpore耗时较长,默认开启8线程,对内存需求较大,且编译生成的build文件夹体积也较大(50GB以上),因此我给虚拟机做了如下配置:

image.png

有条件的话配置越高越好。

软件环境准备

  1. 下载MindSpore源码:git clone gitee.com/mindspore/m…

2.(建议)安装conda,创建虚拟环境:

conda create -n mindspore-build python=3.9 -y

3.安装11.4.0或以下版本的GCC,否则在编译时会出现如下警告:

image.png

事实上,我一开始用的是GCC 13.0版本,在编译某些代码时就出现了error问题(可能13.0版本的编译器更严格),切换到11.4.0版本后,实验下来无问题。即:GCC 11.4.0及以下的版本可用。

二.CMakeLists.txt修改

由于不仅仅是要源码编译MindSpore,还要打开日志,需修改mindspore/CMakeLists.txt,添加两行:

add_compile_definitions(ENABLE_MS_LOGGING=1) # 启用 MS_LOG 宏 add_compile_definitions(ENABLE_DEBUG_LOG=1) # 允许输出 DEBUG 级别日志

三.编译和安装

注意: 编译过程中,MindSpore会从Github等网站下载一些第三方代码包,所以需要保持网络畅通。

编译

我编译的是CPU版本,在build.sh所在目录下执行:

bash build.sh -e cpu -S on

即便按照前文所述的步骤进行,在实际编译过程中也可能会遇到问题,建议问大模型(强烈推荐DeepSeek)寻找解决方案。

安装

编译结束后,在mindspore/build/package路径下会生成:

mindspore-2.5.0-cp39-cp39-linux_x86_64.whl

然后执行:

pip install mindspore-2.5.0-cp39-cp39-linux_x86_64.whl

四.执行程序验证

设置日志输出相关环境变量

export GLOG_v=2 (0:输出DEBUG及以上级别日志 1: INFO 2:WARNING 3:ERROR)

export GLOG_logtostderr=1 # 将日志输出到控制台而不是日志文件

程序验证

安装好MindSpore后可以先执行如下代码,确认安装无问题:

import numpy as np
from mindspore import Tensor
import mindspore.ops as ops
import mindspore.context as context
 
 
context.set_context(debug_level=context.DEBUG, device_target="CPU")
x = Tensor(np.ones([1,3,3,4]).astype(np.float32))
y = Tensor(np.ones([1,3,3,4]).astype(np.float32))
print(ops.tensor_add(x, y))

上面代码执行ok后,可执行如下代码:

import mindspore as ms
import numpy as np
from mindspore import nn, ops, Tensor
from mindspore.common.initializer import Normal
 
# 设置日志级别为 DEBUG(必须!)
ms.context.set_context(debug_level=ms.context.DEBUG, device_target="CPU")  # 启用 Python 层日志
ms.context.set_context(mode=ms.context.GRAPH_MODE)  # 触发 C++ 后端执行
 
# 定义简单网络
class Net(nn.Cell):
    def __init__(self):
        super().__init__()
        self.fc = nn.Dense(10, 10, weight_init=Normal(0.02))
        self.relu = ops.ReLU()
 
    def construct(self, x):
        x = self.fc(x)
        x = self.relu(x)
        return x
 
# 生成随机数据
input_data = Tensor(np.random.randn(32, 10).astype(np.float32))
label_data = Tensor(np.random.randn(32, 10).astype(np.float32))
 
# 定义损失函数和优化器
net = Net()
loss_fn = nn.MSELoss()
optimizer = nn.SGD(net.trainable_params(), learning_rate=0.01)
 
# 定义训练步骤
def train_step(data, label):
    output = net(data)
    loss = loss_fn(output, label)
    optimizer(loss)
    return loss
 
# 运行训练(触发 C++ 后端执行)
loss = train_step(input_data, label_data)
print("Loss:", loss)

执行上面代码会出现如下报错:

image.png 代码出错的出处(validator.cc的62行):

image.png 上面的“Damn!”是我添加的,说明:

1.修改生效了,体现在新编译出的版本中

2.通过MS_LOG记录的日志能输出到控制台(我设置的环境变量GLOG_v=3,即只输出ERROR及以上级别的打印。如果希望深入研究C++代码流程,可以打开更低级别的打印)

五.增量编译

在完成代码修改后,重新执行bash build.sh -e cpu -S on命令(前提:mindspore/build文件夹不要删)即可进行增量编译。编译本身耗时不长,但是链接的过程要花一些时间,大概十几到二十几分钟。