如何在树莓派上部署本地化语言大模型

一、Ollama的安装和使用

Ollama是开源跨平台大模型工具,利用这个工具可以非常方便地在电脑上进行语言的大模型的本地化部署。

1.安装Ollama

在终端上输入以下指令:

curl -fsSL https://ollama.com/install.sh | sh

即可进入安装过程,由于中国大陆的网络问题可能比较缓慢

 2.使用Ollama下载本地化模型

Ollama官网上为我们提供了很多本地化模型的选择:Ollama Search

这里4GB内存的树莓派推荐下载不超过2b量级的大模型,如果是8GB内存的树莓派可以尝试下载不超过7b的大模型。

使用以下命令安装本地化模型:

ollama pull 模型名称:量级

以gemma3的1b模型为例,应该使用以下指令进行下载:

ollama pull gemma3:1b

3.使用Ollama运行本地化模型

使用以下命令

ollama run 模型名称:量级

可以在终端上运行大模型,如果这个模型成功运行并且可以成功回答问题,那么说明这个离线大模型已经成功安装到电脑上了。

二、使用Ollama的pythonAPI将大模型写入python代码

1.创建虚拟环境

这里有两种方法,个人更推荐第二种。

1.使用指令创建一个新的虚拟环境

  在需要创建虚拟环境的目录下输入以下指令:

  python3 -m venv myvenv

  即可创建一个myvenv的文件夹,这个文件夹就是所谓的虚拟环境,这个文件夹的lib目录下是虚拟环境中安装的所有包,bin目录下包括了pip程序,python解释器还有用于激活虚拟环境的active。但是经过我个人的尝试,直接使用这个代码创建的虚拟环境可能面临pip install失败,python解释器定位错误等一系列奇怪问题,所以并不是非常推荐。

2.复制一个已有的虚拟环境文件夹

如上文所说,所谓的虚拟环境就是一个文件夹,那么可以找到一个已经创建好并且没有出现问题的myenv文件夹,将这个文件夹复制到相应的目录下就变成了我们自己的虚拟环境,激活这个虚拟环境之后使用以下命令清空这个虚拟环境中多余的包:

  pip list --format=freeze | grep -vE 'pip|setuptools|wheel' | cut -d= -f1 | xargs pip uninstall -y

  这样我们就得到了一个健康并且干净的虚拟环境了。

2.安装必备的包

首先激活虚拟环境,尝试使用`pip install`进行包的安装,如果一直显示SSL并且没有进行安装的话(注意:有的时候尽管终端上一直刷新SSL的报错信息,但是实际上是进行了安装的,可以看到在终端上时不时会跳出一个安装进度条,最后也有一个安装成功的提示),那么再尝试以下这个代码:

pip install package --trusted-host mirrors.aliyun.com -i https://mirrors.aliyun.com/pypi/simple

把代码里面的package改成需要安装的包的名称就可以了,我几次试下来这个代码是没有问题的。

在这里,我们需要安装的包的名称是ollama

 3.代码示例

安装好包之后,就可以直接写程序了,示例代码如下:
 

import ollama
import time
import signal
import resource
import sys

def init_environment():
    """初始化环境"""
    # 设置内存限制(6GB)
    resource.setrlimit(
        resource.RLIMIT_AS, 
        (6 * 1024**3, resource.RLIM_INFINITY)
    )
    # 注册信号处理
    signal.signal(signal.SIGTERM, lambda s,f: sys.exit(0))
    signal.signal(signal.SIGINT, lambda s,f: sys.exit(0))

def robust_offline_query(prompt, max_tokens=1024):
    """鲁棒的离线查询 - 增强流式响应处理"""
    init_environment()
    
    try:
        client = ollama.Client(
            host='http://127.0.0.1:11434',
            timeout=3000  # time limits
        )
        
        full_response = ""
        print("生成中: ", end="", flush=True)
        
        # 使用chat接口并设置流式响应
        stream = client.chat(
            model='gemma3:1b',
            messages=[{'role': 'user', 'content': prompt}],
            stream=True,
            options={
                'num_predict': max_tokens,
                'temperature': 0.2,
                'num_ctx': 2048,
                'num_thread': 4
            }
        )
        
        # 增强的流式响应处理
        response_chunks = []
        start_time = time.time()
        last_chunk_time = time.time()
        
        try:
            for chunk in stream:
                # 检查是否超时
                if time.time() - last_chunk_time > 60:
                    print("\n警告: 响应超时,可能已结束", flush=True)
                    break
                
                # 获取内容
                content = chunk.get('message', {}).get('content', '')
                if content:
                    print(content, end='', flush=True)
                    response_chunks.append(content)
                    full_response += content
                    last_chunk_time = time.time()
                
                # 检查是否达到最大token数
                if len(full_response.split()) >= max_tokens * 0.9:  
                    print("\n警告: 接近最大token限制", flush=True)
                    break
        except Exception as inner_e:
            print(f"\n流式处理错误: {str(inner_e)}", flush=True)
        
        # 确保所有内容都已收集
        return ''.join(response_chunks)
    
    except Exception as e:
        error_msg = f"错误: {str(e)}"
        print(error_msg, flush=True)
        return error_msg

if __name__ == "__main__":
    print("=== 离线测试 ===")
    prompt = input('请输入指令(输入q退出): ')
    while prompt!='q':
        start_time = time.time()
        response = robust_offline_query(prompt, max_tokens=1024)
        elapsed = time.time() - start_time
        
        # 准确统计token数(近似值)
        token_count = len(response)
        
        print(f"\n耗时: {elapsed:.1f}秒")
        print(f"字符数: {token_count}")
        prompt = input('请输入指令(输入q退出): ')

 三、增加语音播报功能

1.安装必需的组件

在终端中输入:

 sudo apt-get update
 sudo apt-get install espeak

下载espeak进行播报

激活安装了ollama的虚拟环境之后输入:

  pip install pyttsx3

如果pip install报错SSL并且安装失败,使用上面的方法进行安装

下载中文语音包

  espeak的原生版本默认不含中文语音包,所以我们需要额外找到一个语音包代替原有的语音包

  有一篇文章写的挺好的,可以直接按照上面的方法解决:linux espeak语音tts;pyttsx3 ubuntu使用_espeak 中文语音包-优快云博客

到此为止,所有的组件就已经准备完成了,我们只需要在原来代码的基础上稍作修改即可实现语音播报功能。

2.代码示例

import ollama
import time
import signal
import resource
import sys
import pyttsx3
import subprocess
from threading import Lock

tts_lock = Lock()

engine = pyttsx3.init()
engine.setProperty('rate', 150)  # 调慢语速(默认200)
#engine.setProperty('volume', 1.0)  # 最大音量

def init_environment():
    """初始化环境"""
    # 设置内存限制(6GB)
    resource.setrlimit(
        resource.RLIMIT_AS, 
        (6 * 1024**3, resource.RLIM_INFINITY)
    )
    # 注册信号处理
    signal.signal(signal.SIGTERM, lambda s,f: sys.exit(0))
    signal.signal(signal.SIGINT, lambda s,f: sys.exit(0))

def speak(text):
    """文本转语音"""
    with tts_lock:
        try:
            subprocess.run(
                ['espeak', '-v', 'zh', '-s', '120', text],
                stderr=sys.stderr,
                check=True
            )
        except Exception as e:
            print(f"语音播报错误: {e}", flush=True)

def robust_offline_query(prompt, max_tokens=1024):
    """鲁棒的离线查询 - 增强流式响应处理"""
    init_environment()
    sentence_buffer=""
    try:
        client = ollama.Client(
            host='http://127.0.0.1:11434',
            timeout=3000  # time limits
        )
        
        full_response = ""
        print("生成中: ", end="", flush=True)
        
        # 使用chat接口并设置流式响应
        stream = client.chat(
            model='gemma3:1b',
            messages=[{'role': 'user', 'content': prompt}],
            stream=True,
            options={
                'num_predict': max_tokens,
                'temperature': 0.7,
                'num_ctx': 2048,
                'num_thread': 4
            }
        )
        
        # 增强的流式响应处理
        response_chunks = []
        start_time = time.time()
        last_chunk_time = time.time()
        
        try:
            for chunk in stream:
                content = chunk.get('message', {}).get('content', '')
                if content:
                    print(content, end='', flush=True)
                    full_response += content
                    
                    # 中文句子检测
                    sentence_buffer += content.replace('*','')
                    if (any(punc in content for punc in ["。", "!", "?",";", "..."]) or len(sentence_buffer) > 30): 
                        if len(sentence_buffer.strip()) > 1:  # 忽略单个标点
                            speak(sentence_buffer.strip())
                            sentence_buffer = ""
                     elif len(sentence_buffer) > 50:
                         speak(sentence_buffer.strip())
                         sentence_buffer = ""
        
            # 播报剩余内容
            if sentence_buffer:
                speak(sentence_buffer.strip())
                
        except Exception as inner_e:
            print(f"\n流式处理错误: {str(inner_e)}", flush=True)
        
        # 确保所有内容都已收集
        return ''.join(response_chunks)
    
    except Exception as e:
        error_msg = f"错误: {str(e)}"
        print(error_msg, flush=True)
        return error_msg

if __name__ == "__main__":
    print("=== 离线测试 ===")
    prompt = input('请输入指令(输入q退出): ')
    while prompt!='q':
        start_time = time.time()
        response = robust_offline_query(prompt, max_tokens=1024)
        elapsed = time.time() - start_time
        
        # 准确统计token数(近似值)
        token_count = len(response)
        
        print(f"\n耗时: {elapsed:.1f}秒")
        print(f"字符数: {token_count}")
        prompt = input('请输入指令(输入q退出): ')


 

### 树莓派部署强化学习模型 #### 准备工作 为了在树莓派上成功部署强化学习模型,环境配置至关重要。更新并升级现有软件包是首要任务,这可以通过执行以下命令来完成: ```bash sudo apt-get update sudo apt-get upgrade ``` 这些操作能够确保系统处于最新状态,从而减少后续可能出现的兼容性问题[^1]。 #### 安装依赖库 对于特定于深度学习的应用场景而言,安装必要的支持库不可或缺。特别是当涉及到ARM架构下的计算优化时,`arm_compute_library`显得尤为重要。该库提供了高效的矩阵运算函数实现,在处理神经网络推理过程中发挥着重要作用。因此建议通过官方渠道下载对应版本并正确集成至项目环境中[^2]。 #### 编译与构建工具链设置 针对自定义开发或第三方开源框架(如Tengine),通常需要本地化编译过程以适应目标硬件特性。利用CMake作为跨平台构建管理系统可以简化这一流程。下面是一个典型的CMake调用实例用于指定外部依赖路径以及启动实际编译作业: ```cmake cmake -DTENGINE_DIR=/home/pi/Tengine . make ``` 此步骤旨在准备运行时所需的二进制文件和其他资源,以便顺利加载预训练好的强化学习模型进行预测服务[^3]。 #### 部署强化学习模型的具体实践 考虑到树莓派有限的计算能力,选择轻量级且高效能表现良好的算法结构尤为关键。例如DQN (Deep Q-Networks) 或者PPO(Policy Gradient Methods with Proximal Policy Optimization)都是不错的选择。同时也要注意调整超参数以平衡速度和精度之间的关系。另外,由于大多数现代RL框架都已提供Python接口,所以可以直接借助pip等包管理器快速引入所需模块,并编写简单的脚本来控制整个实验周期内的交互逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值