中文llama3仿openai api实战

news2024/10/5 11:22:38

课程介绍

本次课属于【大模型本地部署应用】,基于Chinese-LLaMA-Alpaca-3(GitHub - ymcui/Chinese-LLaMA-Alpaca-3: 中文羊驼大模型三期项目 (Chinese Llama-3 LLMs) developed from Meta Llama 3)项目,介绍如何封装一个私有的兼容openai api的大模型接口,并使用ChatGPTNextWeb开源工具调用此接口。

(1) 在前述课程,我们了解了多机多卡微调、本地调用国外/国内大模型API以及对训练好的模型进行部署推理;

(2) 本次课程,主要侧重大模型本地部署及应用,对已经开源的发布的大模型进行本地私有化部署,不需要接入公网,保障数据传输安全,在局域网内部署即可上线应用。以llama3-8b模型为例,仿openai发布接口进行对话问答系统发布,完成实战,部署完之后的应用完全不依赖互联网,直接在内网环境下应用。

(3)本地部署的客户端多操作系统适用,windows/macos,都可以用来做本次的实验。

计算端部署在同一局域网内的带显卡的机器上或者cpu计算也可,看大家的硬件选择,无显卡也可以做实验,但需要内存(保底24G)较大。

云平台用来训练、微调等,本地部署的实验需要用大家自己的机器。

llama3-8b仿openai发布的应用效果演示,本次实验,我们搭建了客户端进行演示:

实验环境

本文的基础环境如下

操作系统:ubuntu20.04

CUDA:12.2

英伟达显卡驱动版本:535.183.01

显卡型号:本实验用英伟达3090(全模型(未开量化)需要单张显存大于20GB的英伟达显卡;

**开量化之后的模型可以使用11GB显存的英伟达显卡,基本市面上大部分消费级显卡可以满足实验要求,

大家根据自己的显卡进行选择实验)

本文默认您在操作系统的用户名为:llm_course,如果您使用的是其他用户名,请更改涉及到用户名的地址。

下载源码

取出从 https://download.csdn.net/download/fanghailiang2016/89846332 下载的压缩包中的 Chinese-LLaMA-Alpaca-3-3.0.tar.gz 文件 

tar -xvf Chinese-LLaMA-Alpaca-3-3.0.tar.gz

本教程使用的是3.0版本

安装miniconda

我们将使用miniconda发行版python进行后续开发,如果您已经安装miniconda或者conda,可以跳过该章节。

cd ~/ && wget https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-Linux-x86_64.sh
bash Miniconda3-py38_23.5.2-0-Linux-x86_64.sh

输入上述命令后,一直按回车,直到出现下面的内容:

输入yes,然后,按回车,当出现下面的内容:

输入yes,当出现下面的内容时,代表安装完毕:

创建虚拟环境

关闭刚才的终端,然后重新打开终端,连入服务器,创建一个虚拟环境,用于后续开发(什么是conda虚拟环境?):

conda create -n chinese_llama_alpaca_3 python=3.8.17 pip -y

出现下面的信息,代表虚拟环境安装完毕:

模型下载

我们通过modelscope下载基座模型。首先激活刚才创建的虚拟环境:conda activate chinese_llama_alpaca_3,然后通过下面命令安装modelscope核心组件:pip install modelscope -i https://mirrors.aliyun.com/pypi/simple

直接使用命令下载

使用下面命令下载模型:

conda activate chinese_llama_alpaca_3
pip install modelscope -i https://mirrors.aliyun.com/pypi/simple
modelscope download --model ChineseAlpacaGroup/llama-3-chinese-8b-instruct-v3

模型较大,可能需要下载30分钟-60分钟,在此期间不要断开与服务器的连接。

基于screen下载

由于模型较大,可能需要下载30分钟-60分钟,如果在此期间,你与服务器之间的ssh链接断开了,整个下载就中断了,所以我们推荐你使用screen的方式(什么是screen?)下载,命令如下:

screen -R model_download
conda activate chinese_llama_alpaca_3
pip install modelscope -i https://mirrors.aliyun.com/pypi/simple
modelscope download --model ChineseAlpacaGroup/llama-3-chinese-8b-instruct-v3

如果在操作过程中断开了服务器连接,可以使用screen -r model_download恢复操作窗口。

模型存储位置

使用modelscope下载完毕后,模型会存储在如下位置:~/.cache/modelscope/hub/ChineseAlpacaGroup/llama-3-chinese-8b-instruct-v3,正常情况下,可以看到如下内容:

ls -alhrt ~/.cache/modelscope/hub/ChineseAlpacaGroup/llama-3-chinese-8b-instruct-v3

开源版openai接口启动

中文llama3的开源版本实现在以下目录:/home/llm_course/Chinese-LLaMA-Alpaca-3-3.0/scripts/oai_api_demo,下面分别是GPU和CPU版本的启动流程

推理脚本BUG修复

在启动GPU或者CPU版本的仿openai接口(stream流式方式,类似openai打字机回复效果)脚本之前,我们需要修复一个bug,打开/home/llm_course/Chinese-LLaMA-Alpaca-3-3.0/scripts/oai_api_demo/openai_api_server.py文件,找到如下内容:

def stream_predict(
    input,
    max_new_tokens=1024,
    top_p=0.9,
    temperature=0.2,
    top_k=40,
    num_beams=4,
    repetition_penalty=1.1,
    do_sample=True,
    model_id="llama-3-chinese",
    **kwargs,
):
    choice_data = ChatCompletionResponseStreamChoice(
        index=0, delta=DeltaMessage(role="assistant"), finish_reason=None
    )
    chunk = ChatCompletionResponse(
        model=model_id,
        choices=[choice_data],
        object="chat.completion.chunk",
    )
    yield "{}".format(chunk.json(exclude_unset=True, ensure_ascii=False))

    if isinstance(input, str):
        prompt = generate_completion_prompt(input)
    else:
        prompt = generate_chat_prompt(input)
    inputs = tokenizer(prompt, return_tensors="pt")
    input_ids = inputs["input_ids"].to(device)
    generation_config = GenerationConfig(
        temperature=temperature,
        top_p=top_p,
        top_k=top_k,
        num_beams=num_beams,
        do_sample=do_sample,
        **kwargs,
    )

    streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
    generation_kwargs = dict(
        streamer=streamer,
        input_ids=input_ids,
        generation_config=generation_config,
        return_dict_in_generate=True,
        output_scores=False,
        max_new_tokens=max_new_tokens,
        repetition_penalty=float(repetition_penalty)
      )

generation_kwargs改为如下值:

generation_kwargs = dict(
    streamer=streamer,
    input_ids=input_ids,
    generation_config=generation_config,
    return_dict_in_generate=True,
    output_scores=False,
    max_new_tokens=max_new_tokens,
    repetition_penalty=float(repetition_penalty),
    pad_token_id=tokenizer.eos_token_id, # 新添加的参数
    eos_token_id=[tokenizer.eos_token_id, tokenizer.convert_tokens_to_ids("<|eot_id|>")] # 新添加的参数
)

加入上面的参数主要是为了兼容llama3特有的停止token,不然流式接口返回的内容会不断的自动重复,不停止。

GPU版本

备份脚本

使用如下命令备份/home/llm_course/Chinese-LLaMA-Alpaca-3-3.0/requirements.txt文件:

mv /home/llm_course/Chinese-LLaMA-Alpaca-3-3.0/requirements.txt /home/llm_course/Chinese-LLaMA-Alpaca-3-3.0/requirements.bk.txt

安装依赖

通过如下命令创建新的requirements.txt

cat <<EOF > /home/llm_course/Chinese-LLaMA-Alpaca-3-3.0/requirements.txt
accelerate==0.30.0
aiohttp==3.9.5
aiosignal==1.3.1
annotated-types==0.6.0
anyio==4.3.0
async-timeout==4.0.3
attrs==23.2.0
bitsandbytes==0.43.1
certifi==2024.2.2
charset-normalizer==3.3.2
click==8.1.7
datasets==2.20.0
deepspeed==0.13.1
dill==0.3.7
dnspython==2.6.1
einops==0.8.0
email_validator==2.1.1
exceptiongroup==1.2.1
fastapi==0.109.2
fastapi-cli==0.0.3
filelock==3.14.0
frozenlist==1.4.1
fsspec==2023.10.0
h11==0.14.0
hjson==3.1.0
httpcore==1.0.5
httptools==0.6.1
httpx==0.27.0
huggingface-hub==0.23.3
idna==3.7
Jinja2==3.1.4
joblib==1.4.2
markdown-it-py==3.0.0
MarkupSafe==2.1.5
mdurl==0.1.2
modelscope==1.17.1
mpmath==1.3.0
multidict==6.0.5
multiprocess==0.70.15
networkx==3.1
ninja==1.11.1.1
numpy==1.24.4
nvidia-cublas-cu12==12.1.3.1
nvidia-cuda-cupti-cu12==12.1.105
nvidia-cuda-nvrtc-cu12==12.1.105
nvidia-cuda-runtime-cu12==12.1.105
nvidia-cudnn-cu12==8.9.2.26
nvidia-cufft-cu12==11.0.2.54
nvidia-curand-cu12==10.3.2.106
nvidia-cusolver-cu12==11.4.5.107
nvidia-cusparse-cu12==12.1.0.106
nvidia-nccl-cu12==2.18.1
nvidia-nvjitlink-cu12==12.4.127
nvidia-nvtx-cu12==12.1.105
orjson==3.10.3
packaging==24.0
pandas==2.0.3
peft==0.7.1
psutil==5.9.8
py-cpuinfo==9.0.0
pyarrow==16.0.0
pyarrow-hotfix==0.6
pydantic==1.10.11
pydantic_core==2.18.2
Pygments==2.18.0
pynvml==11.5.0
python-dateutil==2.9.0.post0
python-decouple==3.8
python-dotenv==1.0.1
python-multipart==0.0.9
pytz==2024.1
PyYAML==6.0.1
regex==2024.4.28
requests==2.32.3
rich==13.7.1
safetensors==0.4.3
scikit-learn==1.3.2
scipy==1.10.1
shellingham==1.5.4
shortuuid==1.0.13
six==1.16.0
sniffio==1.3.1
sse-starlette==2.1.0
starlette==0.36.3
sympy==1.12
threadpoolctl==3.5.0
tokenizers==0.19.1
torch==2.1.2
tqdm==4.66.4
transformers==4.41.2
triton==2.1.0
typer==0.12.3
typing_extensions==4.11.0
tzdata==2024.1
ujson==5.9.0
urllib3==2.2.1
uvicorn==0.29.0
uvloop==0.19.0
watchfiles==0.21.0
websockets==12.0
xxhash==3.4.1
yarl==1.9.4
EOF

安装依赖:

pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple

启动服务

通过如下命令启动服务:

python openai_api_server.py --gpus 0 --base_model /home/llm_course/.cache/modelscope/hub/ChineseAlpacaGroup/llama-3-chinese-8b-instruct-v3

请注意--gpus后面的参数0,代表我们要使用第一块GPU卡运行大模型服务,如果您的机器只有一块卡,您需要将该参数始终设置为0,也就是--gpus 0

使用--load_in_8bit或者--load_in_4bit可以开启量化加载。

***这一步,大家根据自己的显卡显存大小进行选择***

测试效果

我们使用ChatGPTNextWeb工具测试我们的接口,如果您没有下载客户端,可以通过下面地址下载:

NextChat 文件在 https://download.csdn.net/download/fanghailiang2016/89846332 压缩包中,包含 windows 和 mac 版,根据需要使用

下载后,安装即可。下面开始设置接入我们刚才部署的大模型服务:

CPU版本

创建CPU版本专用虚拟环境

conda create -n chinese_llama_alpaca_3_cpu python=3.8.17 pip -y

安装依赖

pip3 install torch==2.3.0 --index-url https://download.pytorch.org/whl/cpu
pip3 install fastapi==0.111.0 peft==0.7.1 pydantic==1.10.11 pydantic_core==2.18.2 shortuuid==1.0.13 sse-starlette==2.1.0 starlette==0.37.2 transformers==4.41.2 -i https://mirrors.aliyun.com/pypi/simple

启动服务

python openai_api_server.py --only_cpu --base_model /home/llm_course/.cache/modelscope/hub/ChineseAlpacaGroup/llama-3-chinese-8b-instruct-v3

测试效果

可以使用GPU版本同样的方法测试即可。

常见问题

19327 端口冲突

启动脚本时,19327端口冲突,需要修改脚本。找到第394行,如下内容:

uvicorn.run(app, host="0.0.0.0", port=19327, workers=1, log_config=log_config)

其中port=19327就是web服务启动的端口号,将19327改成其他数字即可。

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

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

相关文章

谷歌收录批量查询,谷歌收录批量查询的简单方法

谷歌收录批量查询是网站管理员和SEO优化人员常见的需求&#xff0c;以下提供几种简单且高效的批量查询方法&#xff1a; 一、使用Google Search Console&#xff08;谷歌搜索控制台&#xff09; 注册并验证网站&#xff1a; 首先&#xff0c;确保你已经在Google Search Conso…

常用正则匹配中国手机号码

正则表达式匹配中国的手机号码。 我可以提供一些匹配中国手机号码的常用正则表达式: 仅匹配11位数字的手机号码:^1[3456789]\d{9}$匹配以1开头的11位数字手机号码:^1\d{10}$更宽松的匹配规则,允许0开头的手机号码:^(?:0|86|&#xff0b;?86)?1[3-9]\d{9}$ 这些正则表达式可…

Java基础知识总结(超详细整理)

Java基础知识总结&#xff08;超详细整理&#xff09; Java语言的特点 1.面向对象 面向对象(OOP)就是Java语言的基础&#xff0c;也是Java语言的重要特性。面向对象的概念&#xff1a;生活中的一切事物都可以被称之为对象&#xff0c;生活中随处可见的事物就是一个对象&#…

CMSIS-RTOS V2封装层专题视频,一期视频将常用配置和用法梳理清楚,适用于RTX5和FreeRTOS(2024-09-28)

【前言】 本期视频就一个任务&#xff0c;通过ARM官方的CMSIS RTOS文档&#xff0c;将常用配置和用法给大家梳理清楚。 对于初次使用CMSIS-RTOS的用户来说&#xff0c;通过梳理官方文档&#xff0c;可以系统的了解各种用法&#xff0c;方便大家再进一步的自学或者应用&#x…

【人工智能深度学习应用】妙策API最佳实践

功能概述 在文章创作过程中&#xff0c;用户可以借助AI妙策来辅助创作。AI妙策主要集中在聚合热点话题榜和平台话题榜两个方面。 具体功能 话题分析 AI妙策中的话题分析可以作为创作的灵感来源&#xff0c;通过网页视角选题、热门视角选题、时效视角选题、新颖视角选题&…

网站建设中,如何处理多语言版本?

在全球化的今天&#xff0c;网站多语言版本的处理成为了一项基本要求&#xff0c;尤其是对于面向国际用户的企业来说。以下是一些关于网站建设中如何处理多语言版本问题的建议&#xff1a; 使用URL国际化&#xff1a;通过在URL中添加语言代码&#xff08;如example.com/en/表示…

【文心智能体】猫咪用品购物指南搭建教程

前言 随着科技的飞速发展和人们生活水平的提高&#xff0c;越来越多的家庭开始养宠物&#xff0c;其中猫咪因其可爱、独立和温顺的性格而备受青睐。然而&#xff0c;面对市场上琳琅满目的猫咪用品&#xff0c;如何为自家的“喵星人”挑选最合适的商品&#xff0c;成为了许多宠…

vue3学习:axios输入城市名称查询该城市天气

说来惭愧&#xff0c;接触前端也有很长一段时间了&#xff0c;最近才学习axios与后端的交互。今天学习了一个查询城市天气的案例&#xff0c;只需输入城市名称&#xff0c;点击“查询”按钮便可以进行查询。运行效果如下&#xff1a; 案例只实现了基本的查询功能&#xff0c;没…

51单片机的金属探测器【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块金属检测传感器继电器LED、蜂鸣器等模块构成。适用于金属探测仪、检测金属、剔除金属等相似项目。 可实现功能: 1、LCD1602实时显示是否检测到金属 2、金属检测传感器&#xff08;按键模拟&#xff09;检测是否有…

利用 Python 爬虫采集 1688商品详情

1688是中国的一个大型B2B电子商务平台&#xff0c;主要用于批发和采购各种商品。对于需要从1688上获取商品详情数据、工程数据或店铺数据的用户来说&#xff0c;可以采用以下几种常见的方法&#xff1a; 官方API接口&#xff1a;如果1688提供了官方的API接口&#xff0c;那么可…

Java | Leetcode Java题解之第456题132模式

题目&#xff1a; 题解&#xff1a; class Solution {public boolean find132pattern(int[] nums) {int n nums.length;List<Integer> candidateI new ArrayList<Integer>();candidateI.add(nums[0]);List<Integer> candidateJ new ArrayList<Integer…

【华为HCIP实战课程四】OSPF邻居关系排错时间和区域问题,网络工程师

一、OSPF邻居关系排错 1、MA网络(默认的以太网、FR和ATM)要求掩码一致 2、相邻OSPF设备RID相同不能建立邻居-----上节已经详细演示说明 3、同一链路必须相同区域 4、Hello和死亡时间匹配 5、MTU检测 6、认证 7、Flag位的一致性 8、华为设备上网络类型不一致 二、同一…

红日靶场1学习笔记

一、准备工作 1、靶场搭建 靶场地址 靶场描述 靶场拓扑图 其他相关靶场搭建详情见靶场地址相关说明 2、靶场相关主机信息 后续打靶场的过程中&#xff0c;如果不是短时间内完成&#xff0c;可能ip会有变化 主机ip密码角色win7192.168.122.131hongrisec2019!边界服务器win…

华为OD机试 - 垃圾短信识别(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

8645 归并排序(非递归算法)

### 思路 非递归归并排序通过逐步合并相邻的子数组来实现排序。每次合并后输出当前排序结果。 ### 伪代码 1. 读取输入的待排序关键字个数n。 2. 读取n个待排序关键字并存储在数组中。 3. 对数组进行非递归归并排序&#xff1a; - 初始化子数组的大小curr_size为1。 - 逐…

手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]

有时候&#xff0c;您会被锁定在自己的 Android 设备之外&#xff0c;而且似乎不可能重新进入。 一个例子就是你买了一部二手手机&#xff0c;后来发现无法使用。另一种情况是你忘记了屏幕锁定密码和用于验证密码的 Google 帐户凭据。这种情况很少见&#xff0c;但确实会发生&…

vite学习教程01、vite构建vue2

文章目录 前言一、vite初始化项目二、修改配置文件2.1、修改main.js文件2.2、修改App.vue文件2.3、修改helloworld.vue2.4、修改vite.conf.js2.5、修改vue版本--修改package.json文件 三、安装vue2和vite插件四、启动服务资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝3W&…

网站建设中,静态网页和动态网页分别是什么,有什么区别

在现代网页设计和开发中&#xff0c;理解静态网页与动态网页的区别是至关重要的。 静态网页 定义&#xff1a; 静态网页是指内容固定不变&#xff0c;用户访问时服务器直接返回存储在服务器上的HTML文件。这些页面通常以.html、.htm等扩展名结尾&#xff0c;不包含特殊符号如“…

多模态大模型调研

Clip的泛化能力超强 压缩图片 GPT4 NLP与CV的区分是历史阶段性的产物&#xff0c;有了vit/transformer之后&#xff0c;两者的区分不再明显 Glip 应用于目标检测

Hadoop之WordCount测试

1、Hadoop简介&#xff1a; Hadoop是Apache旗下的一个用Java语言实现的开源软件框架&#xff0c;是一个开发和运行处理大规模数据的软件平台。 Hadoop的核心组件包括Hadoop分布式文件系统&#xff08;HDFS&#xff09;和MapReduce编程模型。HDFS是一个高度容错的系统&#xf…