openharmony部署deepseek
在openharmony@rk3588上部署deepseek相对于linux上困难一些。主要的问题在于:
1,openharmony上没有glibc,而rk平台的机器学习框架依赖它;
2,openharmony的npu驱动过老,导致运算错误;
3,openharmony上python没有或不全,导致ollama引擎无法安装,因此没有办法简单的下载和运行deepseek。
下面就针对上述难点,一步步推进解决:
1,需要使用arm的交叉编译工具链来获得后续的编译工具以及glibc库,下载地址:
注意要选择三元组为x86_64-aarch64-none-linux的版本,该版本交叉编译工具在x86上的gnu-linux上运行,编译出aarch64二进制目标程序。
2,下载rknn-llm仓库,该仓库为瑞芯微cpu的机器学习框架(仓库里包含了deepseek的对它适配的源码),下载地址为:
https://github.com/airockchip/rknn-llm.git
由于瑞芯微算力cpu不足,但它提供了npu可以拥有6tops算力,使用该框架可以利用npu进行运算,同时使用这个框架可以规避openharmony无法运行ollama的困难。
具体步骤如下:
修改deepseek的编译脚本:
cd rknn-llm/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy
修改build-linux.sh如下两部分,并执行已编译:
#arm交叉编译工具链的的前缀(全路径一直写道'-gcc'前)
GCC_COMPILER_PATH=/home/tong/arm/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
#修改编译参数,一些板卡可能需要关闭优化选项,可根据需要自行尝试调整
cmake ../.. \
-DCMAKE_SYSTEM_PROCESSOR=${TARGET_ARCH} \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_C_COMPILER=${C_COMPILER} \
-DCMAKE_CXX_COMPILER=${CXX_COMPILER} \
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
-DCMAKE_C_FLAGS="-march=armv8-a -mtune=generic-armv8-a -g -O0" \
-DCMAKE_CXX_FLAGS="-march=armv8-a -mtune=generic-armv8-a -g -O0"
make -j4
make install
3,升级npu驱动
当做好前两步骤后,尝试部署到鸿蒙系统上冒烟时,会发生三类错误:
第一类是permission denied。这是最先遇到的错误,首先要将执行程序+x权限,但错误并不会消失。其核心问题在于/lib/ld-linux-aarch64.so.1需要有可执行权限。(如果 没有该库,需要从交叉编译工具链中拷贝出来)
第二类是缺少so,所有缺的so都可以从交叉编译工具链中找到,copy过来即可,报错缺哪个拷哪个。
第三类是提示矩阵乘法错误,这是最恼人的,因为没有任何其他提示信息。各种尝试最后发现是openharmony的rknpu版本过旧,需要升级到0.9.8版本:
将rknn-llm仓库中子目录rknpu-driver下的rknpu代码拷贝到鸿蒙linux/driver/rknpu下,重新编译内核。由于该驱动基于的时5.10以后的内核开发的,部署到5.10时会报错一些函数找不到,把对应的函数backport过来即可。
具体要移植的文件:
#内核根目录/include/linux/mm.h
static inline void vm_flags_set(struct vm_area_struct *vma, vm_flags_t flags)
{
vma->vm_flags |= flags;
}
static inline void vm_flags_clear(struct vm_area_struct *vma, vm_flags_t flags)
{
vma->vm_flags &= ~flags;
}
#内核根目录/drivers/rknpu/rknpu_devfreq.c
.set_soc_info = rockchip_opp_set_low_length
#根据各板卡鸿蒙版本不同,有的还需调整5.10的一个拼写错误(编译没有在此报错就不用改):
#把MONITOR_TPYE_DEV改为MONITOR_TYPE_DEV
#根据自己情况修改config:/home/openharmony/device/board/厂家/板卡/kernel/configs/R1_oh_defconfig
#
# RKNPU
#
CONFIG_ROCKCHIP_RKNPU=y
CONFIG_ROCKCHIP_RKNPU_DEBUG_FS=y
# CONFIG_ROCKCHIP_RKNPU_PROC_FS is not set
# CONFIG_ROCKCHIP_RKNPU_FENCE is not set
# CONFIG_ROCKCHIP_RKNPU_SRAM is not set
CONFIG_ROCKCHIP_RKNPU_DRM_GEM=y
CONFIG_ROCKCHIP_RKNPU_PROC_FS=y
CONFIG_ROCKCHIP_RKNPU_FENCE=y
CONFIG_ROCKCHIP_RKNPU_SRAM=y
### liutong
CONFIG_ROCKCHIP_RKNPU_DMA_HEAP=y
### end
# end of RKNPU
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现