SentencePiece android ndk编译

news2024/10/6 20:34:45

LLaMa等LLM语言模型一般使用SentencePiece tokenizer,在端侧部署需要编译和使用其c++版本。

在安卓平台使用NDK编译

CMakeLists.txt需要进行一些修改:

src/CMakeLists.txt如下位置加上log依赖,否则提示android log相关符号不存在。

此外,入口处的CMakeLists.txt加上

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")

可以使得编译后的so大小显著降低,从16.8MB降低到1.9MB。

build.sh参考

#!/bin/bash
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# please set env SDK_ROOT, NDK_ROOT, ANDROID_ABI, MINSDKVERSION

# export SDK_ROOT=/root/codes/cmdline-tools/sdk/
# export NDK_ROOT=/root/codes/cmdline-tools/sdk//ndk/24.0.8215888/

mkdir -p ${SCRIPT_DIR}/build
cd ${SCRIPT_DIR}/build

if [ -z ${ANDROID_ABI} ] ; then
    ANDROID_ABI=arm64-v8a
fi
if [ -z ${MINSDKVERSION} ] ; then
    MINSDKVERSION=21
fi

echo "SDK_ROOT:" $SDK_ROOT
echo "NDK_ROOT:" $NDK_ROOT
echo "ANDROID_ABI:" $ANDROID_ABI
echo "MINSDKVERSION:" $MINSDKVERSION

${SDK_ROOT}/cmake/3.18.1/bin/cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_TOOLCHAIN_FILE=${NDK_ROOT}/build/cmake/android.toolchain.cmake \
    -DANDROID_ABI=${ANDROID_ABI} \
    -DANDROID_NDK=${NDK_ROOT} \
    -DANDROID_PLATFORM=android-${MINSDKVERSION} \
    -DCMAKE_ANDROID_ARCH_ABI=${ANDROID_ABI} \
    -DCMAKE_ANDROID_NDK=${NDK_ROOT} \
    -DCMAKE_MAKE_PROGRAM=${SDK_ROOT}/cmake/3.18.1/bin/ninja \
    -DCMAKE_SYSTEM_NAME=Android \
    -DCMAKE_SYSTEM_VERSION=${MINSDKVERSION} \
    -DANDROID_STL=c++_static \
    -GNinja \
    ..
if [ $? -ne 0 ]; then
    echo "ERROR: cmake $TARGET_NAME failed"
    exit 1
fi

${SDK_ROOT}/cmake/3.18.1/bin/ninja
if [ $? -ne 0 ]; then
    echo "ERROR: build $TARGET_NAME failed"
    exit 1
fi

C++API使用方法

https://github.com/google/sentencepiece/blob/master/doc/api.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/796055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【云原生技术】高效、灵活、易于使用的低代码快速开发平台源码

PaaS低代码快速开发平台是一种快速开发应用系统的工具,用户通过少量代码甚至不写代码就可以快速构建出各种应用系统。 随着信息化技术的发展,企业对信息化开发的需求正在逐渐改变,传统的定制开发已经无法满足企业需求。低代码开发平台&#x…

Michael.W基于Foundry精读Openzeppelin第13期——Checkpoints.sol

Michael.W基于Foundry精读Openzeppelin第13期——Checkpoints.sol 0. 版本0.1 Checkpoints.sol 1. 目标合约2. 代码精读2.1 History体系2.1.1 push(History storage self, uint256 value) && push(History storage self, function(uint256, uint256) view returns (uin…

Windows10下NI板卡驱动安装

文章目录 一. NI(National Instruments 美国国家仪器有限公司)介绍二. NI Package Manager软件说明 一. NI(National Instruments 美国国家仪器有限公司)介绍 官网地址: https://www.ni.com/zh-cn/solutions.html?category&…

基于SpringBoot+Vue的实习管理系统设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

python pip更新

python pip更新 D:\python>python -m pip list Package Version ---------- ------- pip 23.1.2 setuptools 65.5.0[notice] A new release of pip is available: 23.1.2 -> 23.2.1 [notice] To update, run: python.exe -m pip install --upgrade pipD:\pyt…

Qt完成文本转换为语音播报与保存(系统内置语音引擎)

一、前言 在当今数字化社会,人们对于交互式应用程序的需求越来越高。除了传统的图形用户界面,语音交互也成为了一种流行的交互方式。在这种情况下,将文本转换为语音成为了一项重要的技术,它可以为用户提供更加人性化和便捷的交互方式。在此背景下,Qt提供了QTextToSpeech类…

LeetCode·每日一题·2500. 删除每行中的最大值·模拟

作者:小迅 链接:https://leetcode.cn/problems/delete-greatest-value-in-each-row/solutions/2360713/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-rhmz/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获…

Spring AOP 中,切点有多少种定义方式?

在 Spring AOP 中,我们最常用的切点定义方式主要是两种: 使用 execution 进行无侵入拦截。使用注解进行拦截。 这应该是是小伙伴们日常工作中使用最多的两种切点定义方式了。但是除了这两种还有没有其他的呢?今天松哥就来和大家聊一聊这个话…

[linux--->应用层网络通信协议]

文章目录 [TOC](文章目录) 一、应用层通信概念1.协议2.信息接收 二、网络计算器实战应用三、http协议1.基本认识2.宏观理解http3.网站内部跳转4.请求方法5.状态码5.1重定向5.2错误码 6.常见报头7.http会话保持功能8.模拟http协议服务器编程 四、https协议1.加密概念2.加密的作用…

感测型静电消除风扇的特点

感测型静电消除风扇是一种能够有效降低静电累积并减少静电放电的设备。它通常适用于一些对静电敏感的环境,如实验室、电子元器件生产线、医疗设备等。 感测型静电消除风扇主要原理是通过检测周围空气中的静电电位差,当监测到静电电位差超过设定阈值时&a…

视频监控综合管理平台EasyCVR多分屏默认播放协议介绍

国标GB28181视频平台EasyCVR具有强大的数据接入、处理及分发能力,可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理。 视频监控综合管理平台EasyCVR具备视频融合汇聚能力,TSINGSEE青犀视频平台基于云边端一体化架构&…

关于HA集群的搭建

1.回收站功能 为什么要检查 检查数据存活时间是否到达 单位分钟 web端界面删除不走回收站 mapreduce优化 记住 不写磁盘更优化 为什么conbiner可以解决数据倾斜 合并小数据块了 压缩解决不了 数据倾斜 配置多个NN 1.哪个NN出去服务 一个NN Active 其他NN Standby 2.没有…

3ds Max图文教程: 使用动态工具Mass FX 创建风铃动画

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 简单的场景设置 步骤 1 打开 3ds Max。 打开 3ds Max 步骤 2 我将向您展示风铃背后的动态 通过简单的场景设置进行模拟。一旦你有了这个想法,你就可以应用这个 技术到复杂的风铃结构。 基…

智能也是一切社会关系的总和

马克思把人作为“一切社会关系的总和”的论述中,他并非将自然条件作为固定的被给予的条件,而是作为在历史进程中,由于人的活动而发生的改变的被给予的条件来把握的,既从一开始就已经被一定的“生产关系”所塑形和中介了。智能&…

锐浪报表 Grid++Report 导出文件默认文件名

锐浪报表GridReport 打印数据表时,有时要导出EXCEL或PDF文件。 点击导出EXCEL表: 如何在报表中。进行设置: 1、使用Edit软件打开报表模板文件,如: 在Title’‘ 单引号中录入“标题”即可。 2、GridReport默认目录为&a…

自定义数据类型

一、结构体的定义与使用 1. 定义结构体类型 结构体允许将不同类型的数据元素组合在一起形成一种新的数据类型 结构体类型声明一般放在程序文件开头,此时这个声明是全局的。 结构体类型声明也可以放到函数内部,此时这个声明是局部的。 (1&…

spring boot 整合jdbc和事务

访问效果 springboot连接数据库需要整合jdbc与事务,那么改怎么处理,答案是不需要我们处理,springboot已经实现,我们只需在pom文件中引入对应的库然后简单配置即可实现。jdbc驱动的引入,别忘了还有mybatis引入。下面我们…

计数质数,给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。

题记: 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。 示例 1: 输入:n 10 输出:4 解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。 示例 2: 输入:n 0 输出&#x…

活动招募 | 小米黑客马拉松OPEN DAY等你来!

2023年小米黑客马拉松OPEN DAY来啦!不知道大家还记得去年黑马的获奖项目“MiGu”头箍吗?用脑电波控制智能家居的想法让大家眼前一亮! 2023年黑客马拉松也同样精彩纷呈!本届比赛共有76支队伍报名参赛,各个团队不仅在技术…

vue的setup函数

 为了开始使用Composition API,我们需要有一个可以实际使用它(编写代码)的地方;  在Vue组件中,这个位置就是 setup 函数;◼ setup其实就是组件的另外一个选项: 只不过这个选项强大到我们可…