openharmony部署deepseek

在openharmony@rk3588上部署deepseek相对于linux上困难一些。主要的问题在于:

1,openharmony上没有glibc,而rk平台的机器学习框架依赖它;

2,openharmony的npu驱动过老,导致运算错误;

3,openharmony上python没有或不全,导致ollama引擎无法安装,因此没有办法简单的下载和运行deepseek。

下面就针对上述难点,一步步推进解决:

1,需要使用arm的交叉编译工具链来获得后续的编译工具以及glibc库,下载地址:

https://developer.arm.com/-/media/Files/downloads/gnu/14.2.rel1/binrel/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz

注意要选择三元组为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

posted @   南渡北归  阅读(121)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示