LlamaFactory-Ollama-Langchain大模型训练-部署一条龙

server/2024/9/18 12:44:16/ 标签: langchain, llama

前言

近些日子,大模型火的一塌糊涂,那么现在就有义务要学习一套好用的、从 dataset --> train --> deploy 的一整套流程,好拿来装逼。话不多说,进入正题

Train 框架

目前好用的框架太多,如BELLE, ChatGLM等,今天笔者推荐一个 Llama-Factory.

环境安装

git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
conda create -n llama_factory python=3.10
conda activate llama_factory
pip install -e .[torch,metrics]

没错,你没看错,就这么几步,环境就搞定了

Dataset

数据集是通用格式,如下:

[{"instruction": "你好","input": "","output": "您好,我是XX大模型,一个由XXX开发的 AI 助手,很高兴认识您。请问我能为您做些什么?"},{"instruction": "你好","input": "","output": "您好,我是XX大模型,一个由XXX打造的人工智能助手,请问有什么可以帮助您的吗?"}
]

如果是text-to-text任务,可以instruction中写prompt,input 和 output 分别写text即可。

注:还有很多种数据格式,具体见项目的readme

自定义数据集制作好以后,放在项目的 data 下,然后在 data/dataset_info.json 文件中添加描述,如下mydataset

{"starcoder_python": {"hf_hub_url": "bigcode/starcoderdata","ms_hub_url": "AI-ModelScope/starcoderdata","columns": {"prompt": "content"},"folder": "python"},"mydataset": {"file_name": "mydataset.json","file_sha1": "535e1a88e1d480f80eca38d50216ea3a5dbedfa9"}
}

mydataset 是数据集自定义名称,file_namedata 文件夹下数据集json的文件名。file_sha1 通过以下代码哈希加密获得:

import hashlibdef calculate_sha1(file_path):sha1 = hashlib.sha1()try:with open(file_path, 'rb') as file:while True:data = file.read(8192)  # Read in chunks to handle large filesif not data:breaksha1.update(data)return sha1.hexdigest()except FileNotFoundError:return "File not found."# 使用示例
file_path = 'mydataset.json'  # 替换为您的文件路径
sha1_hash = calculate_sha1(file_path)
print("SHA-1 Hash:", sha1_hash)

Train & Inference & Export

具体使用单卡or多卡,微调or全量具体看一下原项目说明,简洁易懂

笔者使用的指令是:

bash examples/full_multi_gpu/single_node.sh

single_node内容:

#!/bin/bash
NPROC_PER_NODE=4  # GPU卡数量,和下边的CUDA_VISIBLE_DEVICES数量对应,否则报错
NNODES=1
RANK=0
MASTER_ADDR=127.0.0.1
MASTER_PORT=29500CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun \--nproc_per_node $NPROC_PER_NODE \--nnodes $NNODES \--node_rank $RANK \--master_addr $MASTER_ADDR \--master_port $MASTER_PORT \src/train.py examples/full_multi_gpu/llama3_full_sft.yaml

再去修改一下你的 stf.yaml 配置文件即可。

train, infer,export model 都只需要一条指令,具体更改配置文件yaml中的参数即可。

CUDA_VISIBLE_DEVICES=0 llamafactory-cli train examples/lora_single_gpu/llama3_lora_sft.yaml
CUDA_VISIBLE_DEVICES=0 llamafactory-cli chat examples/inference/llama3_lora_sft.yaml
CUDA_VISIBLE_DEVICES=0 llamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml

llama_125">Ollama部署

当然前边的 llamafactory-cli chat 也可以进行推理,但是不好用,这时Ollama就闪亮登场

llama_129">导出llama模型

上一步训练好的llama-factory模型,ollama不能直接使用,需要转换一下格式。

  • 如果是 lora 微调,首先使用 llamafactory-cli export 导出合并成一个模型文件;
  • 全量微调只有一个模型文件,不需要操作。

模型转换代码如下:

git clone https://github.com/ollama/ollama.git
cd ollama
# and then fetch its llama.cpp submodule:
git submodule init
git submodule update llm/llama.cpp
# conda 
conda create -n ollama python=3.11
conda activate ollama
pip install -r llm/llama.cpp/requirements.txt
# Then build the quantize tool:
make -C llm/llama.cpp quantize
# convert model
python llm/llama.cpp/convert-hf-to-gguf.py path-to-your-trained-model --outtype f16 --outfile converted.bin

还有不懂可以看原文档中 Importing 部分。

llama_modeldocker_156">量化、创建Ollama model、docker部署

Quantize the model(Optional)

llm/llama.cpp/quantize converted.bin quantized.bin q4_0

Create a Modelfile for your model:

FROM quantized.bin
TEMPLATE "[INST] {{ .Prompt }} [/INST]"

使用docker进行转换Ollama可用的格式:

quantized.binModelfile 移动到 ollama_file 文件夹内(没有创建一个)

docker run -itd --gpus=1 -v ollama_file:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

该过程会自动pull镜像,container创建好以后,进入容器,转换模型:

# 进入container
docker exec -it ollama /bin/bash/
cd /root/.ollama
# 转换ollama可用格式的模型
ollama create name-to-your-ollama-model -f Modelfile
# 测试转换结果
ollama list

直接在docker内部测试:

ollama run name-to-your-ollama-model

停止测试:

/bye

退出docker:

exit

docker的安装参考笔者另一篇博客Ubuntu装机必备软件和配置

服务器or局域网调用

可以通过curl进行,也可以通过post请求

通过curl:

curl http://localhost:11434/api/generate -d '{"model": "name-to-your-ollama-model","prompt":"hello","stream": false
}'

通过post请求:

import json
import requests# Generate a response for a given prompt with a provided model. This is a streaming endpoint, so will be a series of responses.
# The final response object will include statistics and additional data from the request. Use the callback function to override
# the default handler.
def generate(model_name, prompt, system=None):try:url = "http://localhost:11434/api/generate"payload = {"model": model_name, "prompt": prompt, "system": system}# Remove keys with None valuespayload = {k: v for k, v in payload.items() if v is not None}with requests.post(url, json=payload, stream=True) as response:response.raise_for_status()# Creating a variable to hold the context history of the final chunkfinal_context = None# Variable to hold concatenated response strings if no callback is providedfull_response = ""# Iterating over the response line by line and displaying the detailsfor line in response.iter_lines():if line:# Parsing each line (JSON chunk) and extracting the detailschunk = json.loads(line)if not chunk.get("done"):response_piece = chunk.get("response", "")full_response += response_piece# print(response_piece, end="", flush=True)# Check if it's the last chunk (done is true)if chunk.get("done"):final_context = chunk.get("context")# Return the full response and the final contextreturn full_response, final_contextexcept requests.exceptions.RequestException as e:print(f"An error occurred: {e}")return None, Noneif __name__ == '__main__':model = 'name-to-your-ollama-model'SYS_PROMPT= 'hello'USER_PROMPT = "what your favorate movie?"response1, _ = generate(model_name=model, system=SYS_PROMPT, prompt=USER_PROMPT)print(response1)

Langchain部署

上面ollama部署已经比较好用了,但还是缺少一些配置。这个配置也不错
接下来介绍Langchain部署,langchain是个啥,点这里

待更新


http://www.ppmy.cn/server/48046.html

相关文章

大模型日报2024-06-05

大模型日报 2024-06-05 大模型资讯 AI气象预测取得重大进展:单台桌面电脑即可运行全球天气模型 摘要: 一项新的人工智能天气预测模型已经取得重大进展,该模型能够在一台普通的桌面电脑上运行,预测全球天气。这意味着即使没有复杂的物理计算&a…

[Mac软件]Leech for Mac v3.2 - 轻量级mac下载工具

黑果魏叔推荐Leech是由Many Tricks开发的适用于Mac OS X的轻量级且功能强大的下载管理器。 Leech让您完全控制下载,并与浏览器完全集成。您可以将下载排队,暂停和恢复,从受密码保护的服务器下载,并将密码存储在系统范围的安全钥匙…

【Mac版】Java生成二维码

软件版本 IntelliJ IDEA:2023.2 JDK:17 Tomcat:10.1.11 Maven:3.9.3 技术栈 servlet谷歌的:zxing 生成普通的黑白二维码在二维码中间添加一个小图标 github开源项目:qrcode qrcode开源项目的内部是基于z…

【conda】解决conda activate无效的问题

conda activate 虚拟环境名字执行上述命令失效,提示如下信息: 经查询,原因是新版的 conda 不再使用 activate 来激活虚拟环境,而是改用: source activate 虚拟环境名退出虚拟环境还是: conda deactivate…

Java模板模式及代码

意图 在父类中定义了算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤,这种类型的设计模式属于行为型模式。 主要解决的问题 解决在多个子类中重复实现相同的方法的问…

MySQL经典面试题:谈一谈对于数据库索引的理解~~

文章目录 什么是索引?为什么要引入索引?引入索引的代价操作索引的SQL语句索引背后的数据结构B树B 树 回顾思考☁️结语 什么是索引? 数据库中的索引,就相当于一本书的目录。 什么是书的目录?相信大家都并不陌生&#…

【全开源】小区物业收费管理系统小程序(FastAdmin+UniApp)

便捷生活新选择 一款基于FastAdminUniApp开发的一款物业收费管理小程序。包含房产管理、收费标准、家属管理、抄表管理、在线缴费、业主公告、统计报表、业主投票、可视化大屏等功能。为物业量身打造的小区收费管理系统,贴合物业工作场景,轻松提高物业费…

如何快速入门使用Vue.js

目录 学习步骤具体案例案例一:Todo List 应用案例二:用户管理系统 学习步骤 基础知识: HTML/CSS/JavaScript:掌握基本的网页结构、样式和交互是必须的。ES6:了解现代JavaScript的特性,如箭头函数、解构赋值…

【工具箱】嵌入式系统存储芯片——CS创世 SD NAND

大家都知道MCU是一种"麻雀"虽小,却"五脏俱全"的主控。它的应用领域非常广泛,小到手机手表,大到航空航天的设备上都会用到MCU.市面上目前几个主流厂商有意法半导体(其中最经典的一款就是STM32系列)…

运行软件缺失vcruntime140.dll怎么办?vcruntime140.dll缺失的详细解决方法分享

vcruntime140.dll 是一个动态链接库文件,它是 Microsoft Visual C Redistributable Package 的一部分,为使用 Visual C 编译器开发的应用程序提供必要的运行时环境。该文件包含了大量应用程序运行时需要调用的库函数,这些函数是实现 C 标准库…

Python——range() 函数用法详解

Python——range() 用法详解 range() 是一个用于生成整数序列的内置函数,在Python中常用于循环迭代等场景。 它可以接受一个或多个参数,生成一个按指定规则的整数序列。 1.range() 函数的语法 range(stop) range(start, stop,[step])start&#xff1…

Python第二语言(三、Python函数def)

目录 1. Python函数(def 函数名():) 1.1 sorted对容器进行排序:无法指定排序规则 1.2 sort对容器自定义排序:可以指定排序规则 1.3 获取变量长度函数(len) 1.4 函数的定义 1.5 函数-传参定义 1.6 函…

C++ Primer Chapter 4 Expressions

Chapter 4 Expressions 4.11 类型转换 4.11.2 其他隐式类型转换 数组转换成指针: 在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针: int ia[10]; int* ipa;♜ 当数组被用作decltype关键字的参数,或者作为取地…

Spring Boot项目中,如何在yml配置文件中读取maven pom.xml文件中的properties标签下的属性值

一、前言 在最近的项目开发过程中&#xff0c;有一个需求&#xff0c;需要在Spring Boot项目的yml配置文件中读取到mave的 pom.xml文件中的properties标签下的属性值&#xff0c;这个要怎么实现呢&#xff1f; 二、技术实践 pom.xml文件中增加测试属性 <properties><…

调试记录-uboot编译出错

问题描述 RK平台在编译uboot代码过程中&#xff0c;可能因为编译环境的问题&#xff0c;会报这样的错误&#xff0c;导致编译不过&#xff1a; $ ./make.sh rk3399 make for rk3399_defconfig by -j8HOSTCC scripts/basic/fixdepHOSTCC scripts/kconfig/conf.oHOSTCC scri…

FAPROTAX分析:R语言实现微生物群落功能注释分析及可视化

数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 原核生物分类单元功能注释 Functional Annotation of Prokaryotic Taxa (FAPROTAX)是美国俄勒冈大学生物学系Louca实验室开发的一个数据库&#xff0c;该数据库利用当前有关培养菌株的文献&…

设计模式基础

什么是设计模式 设计模式是一种在软件设计过程中反复出现的问题和相应解决方案的描述。它是一种被广泛接受的经验总结&#xff0c;可以帮助开发人员解决常见的设计问题并提高代码的重用性、可维护性和可扩展性。 设计模式可以分为三类&#xff1a; 创建型模式&#xff08;Crea…

【C语言】详解函数(下)(庖丁解牛版)

文章目录 1. 前言2. 数组做函数形参3. 函数嵌套调用和链式访问3.1 嵌套调用3.2 链式访问 1. 前言 详解C语言函数(上)的链接&#xff1a;http://t.csdnimg.cn/EGsfe 经过对函数的初步了解之后,相信大家已经对C语言标准库里的函数已经有初步的认知了&#xff0c;并且还学会了如…

『大模型笔记』FlashAttention: 具有IO意识的快速且内存高效的精确注意力机制!

Flash Attention的工作,即快速且内存高效的具有IO感知的精确注意力机制! 文章目录 一. 引言1. Flash Attention要点2. 动机:对更长的序列进行建模二. FlashAttention: 具有IO意识的快速且内存高效的精确注意力机制1. Background: Attention is the Heart of Transformers1.1…

Github 2024-06-06 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:2724 次关注人…