在Modelarts上微调量化Llama3,并用docker部署

本文概述

本文先使用llama-factory去微调llama3大模型,然后使用llama.cpp去量化模型并打包为docker部署到服务器上让qq机器人能够调用服务,实现qq群内问答。

效果展示

环境准备

本文使用华为云的Modelarts的notebook去进行的模型微调

ubuntu20.04,cuda:11.7,pytorch:2.0.0,gpu:v100 32G

一、配置自定义镜像

华为云默认的镜像非常垃圾,请自行前往AI Gallery里面获取自定义镜像

链接:AI Gallery_算法_开发者_华为云

推荐使用这个,然后点击进入详情页

复制与你modelarts相同区域的url

然后在modelarts控制台的镜像管理这里去点击注册镜像

粘贴刚才复制的url,然后把这两个类型都勾选上,自定义镜像就创建完成

二、创建notebook

按照上图去进行配置,注意的是我们要开启这个ssh远程开发,因为使用modelarts自带的非常难用。

然后进入notebook详情页,在地址哪里第一个框就是服务器的用户名,第二个框是主机地址

三、使用Xshell和Xftp连接服务器

将主机地址和端口号填好,然后点击确认

然后输入用户名

选择public,然后点击浏览并选择用户密钥

然后点击导入,导入你刚才在华为云哪里配置的密钥对文件(后缀为.pem)

然后选择用户密钥之后,点击确认

然后就连接成果了,Xtfp也是这样操作,具体就不演示了。

四、安装llama-factory

执行下面指令,即可完成安装

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

五、下载llama3-8b-chinese-chat

因为llama3-8b基本上是没有任何中文能力的,所以我们需要在别人训练好的中文模型的基础上进行微调,如果你的任务是英文的那么直接下载原版的就好了。

因为hugging face上下载速度堪忧,我这里直接上传到百度网盘上供大家下载。

链接:https://pan.baidu.com/s/1ETy7Q90IPdJbVLOXjVFGeA?pwd=6rw7 
提取码:6rw7 
--来自百度网盘超级会员V5的分享

六、准备好微调数据集

这个数据集是我自己采集数据构建的特定任务数据集,大概有1200多组数据,共80多W字。

七、修改dataset_info.json

然后按照这个结构去增加你新添加的数据集信息

八、使用factory webui界面去可视化微调llama3

先将之前下载的中文模型通过xftp上传到服务器,将修改后的datasets_info.json覆盖原来服务器上的

然后执行下面这行代码

CUDA_VISIBLE_DEVICES=0 llamafactory-cli webui

然后点击属性

点击添加按钮

将目标端口改为factory web服务的端口,然后点击确定。

然后在浏览器上输入127.0.0.1:7777就可以打开factory webui页面

然后调整参数进行训练即可,具体调参和训练过程这里就不演示了

九、合并lora模型

在LLaMA-Factory的examples/merge_lora文件夹下,编辑llama3_lora_sft.yaml文件

其中model_name_or_path是预训练大模型的路径,adapter_name_or_path是我们微调好的lora的路径。export_device默认为cpu,如果你需要使用gpu去进行推理的话就改为gpu

保存之后我们执行下面这行命令,完成lora和预训练模型的合并

CUDA_VISIBLE_DEVICES=0 llamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml

十、安装llama.cpp

$ git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

注意,编译的话有两种

第一种是使用cpu去推理

make

第二种是使用gpu去推理

make LLAMA_CUDA=1

根据你的需求去选择编译类型,然后等待编译完成,便完成了llama.cpp的安装

十一、将hugging face格式的模型转换为gguf格式的模型

在llama.cpp根目录下执行下面这个命令,后面的路径是要转化格式的模型路径

python convert-hf-to-gguf.py /home/ma-user/llama3/LLaMA-Factory/models/llama3_lora_sft

转换好的后得到一个gguf格式的模型权重文件

十二、将模型量化为4bit,加快推理速度

./quantize /home/ma-user/llama3/LLaMA-Factory/models/llama3_lora_sft/ggml-model-f16.gguf /home/ma-user/llama3/LLaMA-Factory/models/llama3_lora_sft/ggml-model-q4.0.gguf q4_0

第一个路径是原来精度的gguf模型路径,第二个路径是量化后模型的保存路径,q4_0这个参数的意思是将模型量化为4bit

至此就完成了模型的量化

十三、测试模型

./server -m /home/ma-user/llama3/LLaMA-Factory/models/llama3_lora_sft/ggml-model-q4.0.gguf -c 4096 -b 64 -n 1024 -t 9999 --repeat_penalty 1.2 --top_k 20 --top_p 0.5 --color -i  --main-gpu 0 --n_gpu_layers 33 --port 60006 -ngl 41

使用这行命令启动llama.cpp的可视化界面

端口这样设置

然后我们在浏览器上输入127.0.0.1:7778打开可视化界面

十四、使用docker部署模型

ps:modelarts里面没有docker,并且也不能安装docker,所以下面这几步我在本地主机上演示,你们也可以在有GPU的服务器上进行(我A100云服务器过期了什么人间疾苦)

执行下面这条命令

docker run -d -p 8080:8080 -v D:/llama3/models:/models --name llama3 --gpus all ghcr.io/ggerganov/llama.cpp:server-cuda -m models/ggml-model-q4.0.gguf -c 4096 -b 64 -n 1024 -t 9999 --repeat_penalty 1.2 --top_k 20 --top_p 0.5 --n_gpu_layers 33 --host 0.0.0.0 --port 8080

然后执行

docker ps

出现这个就是运行成功了

import requests

def send_request(prompt):
    url = "http://localhost:8080/completion"  # 假设服务端点为/completion,根据实际情况调整
    headers = {
        "Content-Type": "application/json",
    }
    data = {
        "prompt": prompt,
        "n_predict": 1024
    }

    try:
        response = requests.post(url, headers=headers, json=data)
        response.raise_for_status()  # 如果响应状态码不是200,将抛出异常
        response_data = response.json()
        print("Response:", response_data)
    except requests.exceptions.RequestException as e:
        print(f"Error occurred: {e}")


if __name__ == "__main__":
    prompt = '{"prompt":"给出一个游戏设计创意"}'
    send_request(prompt)

然后我们用python去写个请求去测试一下我们的api服务是否正常

最后也是能够正常的调用我们的llama3去生成这个回答。

十五、部署到QQ机器人上

这部分过于繁杂,而且难度不大,暂时省略。

(完结撒花了~,这篇文章是偏向应用的,后续会更新更多涉及原理的文章)

作者介绍

作者本人是一名人工智能炼丹师,目前在实验室主要研究的方向为生成式模型,对其它方向也略有了解,希望能够在CSDN这个平台上与同样爱好人工智能的小伙伴交流分享,一起进步。谢谢大家鸭~~~

 如果你觉得这篇文章对您有帮助,麻烦点赞、收藏或者评论一下,这是对作者工作的肯定和鼓励。  

尾言

 如果您觉得这篇文章对您有帮忙,请点赞、收藏。您的点赞是对作者工作的肯定和鼓励,这对作者来说真的非常重要。如果您对文章内容有任何疑惑和建议,欢迎在评论区里面进行评论,我将第一时间进行回复。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑马es学习

es 0. 基础概念0.1 倒排索引0.2 文档、索引0.3 与mysql对比 1 基本操作1.1 mapping 索引库操作1.2 单个文档CRUD 3. DSL查询3.1 查询所有3.2 全文检索3.3 精确查询3.4 复合查询-相关性得分3.5 分页3.6 高亮3.7 总结 2. RestClientmysql与es数据同步es集群去重 黑马视频 官方使…

【李宏毅-生成式 AI】Spring 2024, HW5:LLM Fine-tuning 实验记录

文章目录 1. Task Overview2. Overall Workflow3. Dataset 介绍4. 代码介绍4.1 环境介绍4.2 下载 dataset4.3 下载并加载模型4.2 Notebook 代码1)import 部分2)固定 seed3)加载 LLM4)加载 tokenizer5)设置解码参数6&am…

【Linux系统化学习】传输层——TCP协议

目录 预备知识 全双工协议 协议缓冲区 TCP协议 TCP协议格式 六个标志位 两个问题 确认应答机制 流量控制 超时重传机制 连接管理机制 CLOSE_WAIT状态 TIME_WAIT状态 滑动窗口 拥塞控制 延迟应答 捎带应答 粘包问题 TCP的异常情况 TCP小结 TCP/UDP协议对比…

数据结构:插入排序和希尔排序

插入排序 逆序的情况下: 时间复杂度:O(N^2) 空间复杂度:O(1) 顺序的情况下: 时间复杂度:O(N) 空间复杂度…

【教程】怎么获取IPV6,我教你

1.png 所以IPV6诞生了 IPV6拥有超大的地址空间 IPv4 采用 32 位地址长度,可以为我们提供 2^32 大约 43 亿个地址,而 IPv6 采用 128 位地址长度,为我们提供了 2^128 个地址 博主的家里用的宽带是移动宽带,众所周知,…

【qt】绘图

绘图 一.画家二.绘图事件三.坐标体系四.画笔1.setColor2.setWidth3.setStyle4.setCapStyle5.setJoinStyle6.给画家配置笔 五.画刷1.setColor2.setStyle3.给画家设置刷子 六.用到的类汇总1.QRect 矩形2.QPoint 点3.QImage 图片4.QPixmap 图片5.QLine 线6.QPainterPath 路径 七.开…

关于用宽带(拨号)连接VPN无法上网,但是wifi或者热点就可以的问题

参考链接:https://zhuanlan.zhihu.com/p/580929250https://zhuanlan.zhihu.com/p/580929250 https://blog.csdn.net/Yaoyao2024/article/details/132245249文章浏览阅读10w次,点赞161次,收藏515次。很多同学在学习访问学校提供的资源时或者一…

selenium自动化测试入门 —— 上传文件

selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别窗口元素。 上传文件有两种场景:input控制上传和非input控件上传。 大多数情况都是input控件上传文件,只有非常少数的使用自定义的非input上传文件。 一、input控…

python实践笔记(一): 模块和包

1. 写在前面 最近在重构之前的后端代码,借着这个机会又重新补充了关于python的一些知识, 学习到了一些高效编写代码的方法和心得,比如构建大项目来讲,要明确捕捉异常机制的重要性, 学会使用try...except..finally&…

mathematica中针对三维图中的颜色和填充透明度进行指定

颜色指定使用的命令为:PlotStyle 填充的透明度使用的命令为:FillingStyle 示例代码: Clear["Global*"] Plot3D[{Sin[x^2 y], Sin[x^2 - y]}, {x, -2, 2}, {y, -2, 2}, PlotStyle -> {Directive[Red, Specularity[White, 100…

车联网安全入门——CAN总线模糊测试

文章目录 车联网安全入门——CAN总线模糊测试介绍主要特点使用场景 模糊测试(Fuzz Testing)CAN 总线模糊测试(CAN Packet Fuzzing)主要步骤工具和软件主要目标 Can-Hax安装使用获得指纹模糊测试 SavvyCAN 总结参考 车联网安全入门…

监听DB配置变更之go-broadcast简单实现

文章目录 1. 前言2. 分析3. 实现4. 问题5. 小结6. 参考 1. 前言 之前遇到一个需求,因为配置的查找是基于db的,而db的更改却无法实时通知到具体利用到这条数据的使用方,为了实现db数据变动时,能够尽快让使用方知道这条数据发生了变…

数仓建模中的一些问题

​​​在数仓建设的过程中,由于未能完全按照规范操作, 从而导致数据仓库建设比较混乱,常见有以下问题: 数仓常见问题 ● 数仓分层不清晰:数仓的分层没有明确的逻辑,难以管理和维护。 ● 数据域划分不明确…

排序题+贪心

排序力扣题 一&#xff1a;合并区间 56. 合并区间 方法一&#xff1a;先排序再合并 如图&#xff0c;把区间按照起点从小到达排序&#xff0c;如果起点相同那么按照终点小的优先排序 然后每次记录一个区间&#xff0c;访问下一个区间&#xff1a; 如果下一个区间的起点<前…

使用NetAssist网络调试助手在单台计算机上配置TCP服务器和客户端

要使用NetAssist网络调试助手在同一台计算机上配置一个实例作为服务器&#xff08;server&#xff09;和另一个实例作为客户端&#xff08;client&#xff09;&#xff0c;可以按照以下步骤进行操作&#xff1a; 前提条件 确保已经安装NetAssist网络调试助手&#xff0c;并了…

【十大排序算法】归并排序

归并排序&#xff0c;如同秋日落叶&#xff0c;分散而细碎&#xff0c; 然而风吹叶动&#xff0c;自然而有序&#xff0c; 彼此相遇&#xff0c;轻轻合拢&#xff0c; 最终成就&#xff0c;秩序之谧。 文章目录 一、归并排序二、发展历史三、处理流程四、算法实现五、算法特性…

LLVM Cpu0 新后端4

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…

数据结构和算法之数组和链表

一、数组 数组是一种线性数据结构&#xff0c;它是由一组连续的内存单元组成的&#xff0c;用于存储相同类型的数据。在JavaScript中&#xff0c;数组可以包含任意类型的数据&#xff0c;不只限于基本数据类型。 1.存储方式 在内存中&#xff0c;数组的元素是连续存储的&…

芒果YOLOv10改进38:写作篇:一文了解YOLOv10如何打印FPS指标

只需订阅这一个专栏即可阅读:芒果YOLOv10所有改进内容 💡🚀🚀🚀本博客内含改进源代码,按步骤操作运行改进后的代码即可 💡更方便的统计更多实验数据,方便写作 新增YOLOv10打印FPS指标 完善(一键YOLOv10打印FPS指标) 文章目录 完善(一键YOLOv10打印FPS指标)YOLO…

欧美北美南美国外媒体投稿和东南亚中东亚洲媒体海外新闻发稿软文推广营销策略有哪些?

在当今全球化的浪潮中&#xff0c;中国品牌正积极拓展海外市场&#xff0c;寻求更广阔的发展空间。面对国际竞争&#xff0c;有效的海外媒体发稿营销策略对于品牌国际化至关重要。以下是一些关键点和建议&#xff0c;以帮助品牌在海外市场取得成功。 深入了解目标市场&#xf…