学习心得1
背景
开源大模型DeepSeek通过优化模型结构使得其训练和部署成本降低,迅速火爆。其中的MoE模型和使用类o1/R1慢思考模型提升推理结果给大模型的发展带来了机遇和挑战。
虽然DeepSeek大模型的训练成本更低,且模型本身开源,但是对于普通开发者仍然难以部署和训练。为此采用模型蒸馏的方式可以以更低的成本部推理署能力满足要求的模型。
MindSpore是一个AI框架,可以提升AI开发工程的效率,并且与硬件相关联,可以更好的实现模型应用落地。MindSpore底层采用了实现多种算子的CANN架构,且集成了很多业界常用算法、模型,方便使用和开发。
香橙派开发板有很多路线,其中昇腾路线 AI Pro可以以低成本来开发应用并连接外设,是很好的发开选择。
昇思+香橙派的组合在AI开发方面有3大优势:
- 与
Huggingface等相适应,开发友好 - 可以利用 即时编译(
just in time,jit)实现性能提升 - 从开发到推理应用的全流程支持
很多常用的模型案例已经实现,可供开发参考。
开发与适配
以DeepSeek-R1-Distill-Qwen-1.5B为例,由于部署DeepSeek-R1成本高,而使用成本更低的开源模型Qwen2或者Qwen2.5进行部署,利用知识蒸馏可以既保证模型推理能力,又显著降低开发、部署成本。
知识蒸馏中两个关键:
- 用
DeepSeek-R1生成高质量数据 - 基于这些数据的进行微调
开发过程中的关键是要配置好开发环境,各种配套依赖:
- 注意镜像和不同规格的开发板是否适配
- 固件驱动,
CANN安装(toolkit+kernels) MindSpore与CANN版本适配MindSpore NLP
可以通过run_check()检查
开发环境的检查:
CANN
cat /usr/local/Ascent/lastest/aarch64-linux/*.info
Beta版本一般没有后缀。
MindSpore
pip show mindspore
Mind NLP
pip show mindnlp
如果版本不符合自己的开发要求,可以自行参考官网安装需要的版本。
在香橙派上的开发与适配
MindSpore NLP 有很多单元测试(ut) 可以利用pytest测试,
设置环境变量:
export RUN_SLOW=True
不仅测试是否能跑通,还能对模型精度进行检查。
找到对应模型的test脚本,如
pytest -v -s tests/transformers/models/qwen2/tst_modelling_qwen2.py
由于MindSpore动态图下框架存在多线程异步⾏为,所以会出现python调⽤栈不准确的场景,为了精准定位问题 在test_modeling_qwen2.py脚本中import mindspore之后的位置,加入如下代码,重新跑pytest,查看具体的报错位置并根据报错信息修改
mindspore.set_context(pynative_synchronize=True)
针对算子缺失的处理方式
ACLNN算子缺失的情况可以通过调用支持更广泛的ACLOP来解决
pytest -s -v tests\ut\transformers\models\qwen2\test_modeling_qwen2.py::Qwen2ModelTest::test_Qwen2_sequence_classification_model
针对损失函数报错的处理方式
pytest -s -v tests\ut\transformers\models\qwen2\test_modeling_qwen2.py::Qwen2ModelTest::test_Qwen2_sequence_classification_model
损失函数相关的问题,建议使用 mindspore.ops.primitive中的接口替换,通过查阅文档可知,其中支持昇腾硬件的接口为 mindspore.ops.SoftmaxCrossEntropyWithLogits。变量类型很重要,开发板可能支持float16和int32而不支持float32和int64。
针对香橙派上Tensor索引/切片报错的处理方式
执行测试用例
pytest -s -v tests\ut\transformers\models\qwen2\test_modeling_qwen2.py::Qwen2ModelTest::test_beam_search_generate_dict_outputs_use_cache
tuple 类型转换成Tensor类即可解决。