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

news2024/11/9 9:39:11

本文概述

本文先使用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这个平台上与同样爱好人工智能的小伙伴交流分享,一起进步。谢谢大家鸭~~~

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

尾言

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

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

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

相关文章

揭开FFT时域加窗的奥秘

FFT – Spectral Leakage 假设用于ADC输出数据分析的采样点数为N,而采样率为Fs,那我们就知道,这种情况下的FFT频谱分辨率为δf,那么δfFs/N。如果此时我们给ADC输入一个待测量的单频Fin,如果此时Fin除以δf不是整数&a…

IP地址冲突检测(Address Conflict Detect)记录

学习目标: 提示:ACD(IP地址冲突检测)原理学习与抓包分析 学习记录: 1、Address Conflict Detection地址冲突检测,简称ACD。RFC 5227提出ACD机制。其中ACD将arp request分为ARP probe和ARP announcement两种; ACD定义…

数据中心网络运维探讨

数据中心网络运维探讨 数据中心网络运维通过科学的网络架构设计、实时监控管理、智能化运维工具和全面的安全防护,确保网络的高效、安全运行。它不仅提升了运维效率和网络可靠性,还保障了业务的连续性和数据安全。随着技术的不断进步,智能化…

常见机器学习的原理及优略势

有监督 一、线性回归(Linear Regression) 1. 算法原理 线性回归(Linear Regression)是一种基本的回归算法,它通过拟合一个线性模型来预测连续型目标变量。线性回归模型的基本形式是:y w1 * x1 w2 * x2 … wn * …

在python中关于元组的操作

创建元组 如上图所示,a()和b tuple(),,这两种方式都可以创建出元组。 在创建元组的时候,指定初始值 如上图所示,也可以在创建元组的时候,指定初始值。 同列表一样元组中的元素也可以是任意类型的。 同列…

Map深度学习

Map Map是一个键值对的集合,和object类似,Map作为构造函数,可以通过全局对象获取到。需要通过new操作创建实例对象,直接调用会报错。Map构造函数接受一个iterable类型的函数,用来初始化Map。 var m new Map([[1, &qu…

pyrouge(ROUGE-1.5.5)的安装步骤和使用说明(适用于Linux 系统)

摘要:本文讲解了如何配置和使用文本摘要的评价指标ROUGE(linux 系统)。 ✅ NLP 研 1 选手的学习笔记 简介:小王,NPU,2023级,计算机技术 研究方向:摘要生成、大语言模型生成 文章目录 一、为啥要写这篇博客&…

Redis 双写一致原理篇

前言 我们都知道,redis一般的作用是顶在mysql前面做一个"带刀侍卫"的角色,可以缓解mysql的服务压力,但是我们如何保证数据库的数据和redis缓存中的数据的双写一致呢,我们这里先说一遍流程,然后以流程为切入点来谈谈redis和mysql的双写一致性是如何保证的吧 流程 首先…

flink源码系列:RPC通信

这里写目录标题 1. 本节课目的2.开始本节内容2.1.RPC概念3.2.大数据组件常见的RPC实现技术3.3.Pekko(Akka)3.3.1. Akka、Pekko基本概念3.3.2.Pekko Demo事例3.3.2.1.PekkoData 类3.3.2.2.PekkoRpcReceiverActor类3.3.2.3.PekkoRpcSenderActor 类3.3.2.4.…

传感器展会|2024厦门传感器与应用技术展览会

传感器展会|2024厦门传感器与应用技术展览会 时间:2024年11月1-3日 地点:厦门国际会展中心 XISE EXPO展会介绍: 2024中国(厦门)国际传感器与应用技术展览会将于2024年11月1-3日在厦门国际会展中心举行&#xf…

基于标定数据将3D LiDAR点云与相机图像对齐(含C++版本代码)

这段C代码演示了如何将Velodyne激光雷达的点云数据投影到相机图像上。该过程涉及以下主要步骤: 读取并解析来自文件的标定数据,包括P2矩阵、R0_rect矩阵和Tr_velo_to_cam矩阵。这些矩阵用于将激光雷达点云从Velodyne坐标系转换到相机坐标系。从二进制文件中读取Velo…

10.1 Go Goroutine

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

解密Spring Boot:深入理解条件装配与条件注解

文章目录 一、条件装配概述1.1 条件装配的基本原理1.2 条件装配的作用 二、常用注解2.1 ConditionalOnClass2.2 ConditionalOnBean2.3 ConditionalOnProperty2.4 ConditionalOnExpression2.5 ConditionalOnMissingBean 三、条件装配的实现原理四、实际案例 一、条件装配概述 1…

SpringBoot中实现一个通用Excel导出功能

SpringBoot中实现一个通用Excel导出功能 文章目录 SpringBoot中实现一个通用Excel导出功能这个导出功能的特色看效果代码解析1、依赖2、Excel 入参(ExcelExportRequest)3、Excel 出参(ExcelExportResponse)4、ExcelExportField5、ExcelExportUtils 工具类6、ExcelHead 头部…

LeetCode1318或运算的最小翻转次数

题目描述 给你三个正整数 a、b 和 c。你可以对 a 和 b 的二进制表示进行位翻转操作,返回能够使按位或运算 a OR b c 成立的最小翻转次数。「位翻转操作」是指将一个数的二进制表示任何单个位上的 1 变成 0 或者 0 变成 1 。 解析 这一题就按位依次比较就行了。取这…

【SQLAlChemy】Query函数可传入的参数有哪些?

Query 函数的使用 参数种类 一般可以传递的参数有如下三种: 模型名。指定查找这个模型的全部属性(对应于数据库查询中的全表查询)。模型中的属性。可以用来指定只查询某个模型的几个属性值。使用聚合函数。 func.count():统计行的数量。fu…

【机器学习】GPT-4中的机器学习如何塑造人类与AI的新对话

🚀时空传送门 🔍引言📕GPT-4概述🌹机器学习在GPT-4中的应用🚆文本生成与摘要🎈文献综述与知识图谱构建🚲情感分析与文本分类🚀搜索引擎优化💴智能客服与虚拟助手&#x1…

打造智慧校园信息系统,提升学校科技实力

在如今数字化的时代,打造智慧校园信息系统已成为提升学校科技实力的关键。随着科技的迅猛发展,学校需要跟上时代步伐,利用先进技术建设一个高效、智能的信息系统,为学生、教师和管理人员提供更好的学习和工作环境。 智慧校园信息系…

企业官网:过时了,但又没完全过时

作为一名互联网冲浪级选手,我经常会看到一些有趣的产品。 这两年比较让我感兴趣的产品有「飞聊」、「即刻」及其旗下的「橙 App」等等,然后我就想上它们的官网看看。 虽然现在 app 是主流,但我非常不喜欢下载 app,一是麻烦&…

数据结构与算法笔记:基础篇 - 二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?

概述 上篇文章,我们学习了树、二叉树及二叉树的遍历,本章来学习一种特殊的二叉树,二叉查找树。二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。 之前说过,散列表也是支持这些操作的&#xf…