(之前是把文章发到CSDN上的,后来发现这网站僵尸粉太多了,于是转战掘金)
想研究MindSpore的C++后端代码,自然需要自己基于源码编译出版本(例如,在代码中加日志确认程序执行流程等),记录一下整个过程:
一.环境准备
我是在windows机器上装的VMware,在VMware安装Ubuntu24.04.01,然后在Ubuntu中进行后续操作。
硬件环境准备
初次编译MindSpore耗时较长,默认开启8线程,对内存需求较大,且编译生成的build文件夹体积也较大(50GB以上),因此我给虚拟机做了如下配置:
有条件的话配置越高越好。
软件环境准备
- 下载MindSpore源码:git clone gitee.com/mindspore/m…
2.(建议)安装conda,创建虚拟环境:
conda create -n mindspore-build python=3.9 -y
3.安装11.4.0或以下版本的GCC,否则在编译时会出现如下警告:
事实上,我一开始用的是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)
执行上面代码会出现如下报错:
代码出错的出处(validator.cc的62行):
上面的“Damn!”是我添加的,说明:
1.修改生效了,体现在新编译出的版本中
2.通过MS_LOG记录的日志能输出到控制台(我设置的环境变量GLOG_v=3,即只输出ERROR及以上级别的打印。如果希望深入研究C++代码流程,可以打开更低级别的打印)
五.增量编译
在完成代码修改后,重新执行bash build.sh -e cpu -S on命令(前提:mindspore/build文件夹不要删)即可进行增量编译。编译本身耗时不长,但是链接的过程要花一些时间,大概十几到二十几分钟。