2023年的深度学习入门指南(6) - 在你的电脑上运行大模型

2023年的深度学习入门指南(6) - 在你的电脑上运行大模型

上一篇我们介绍了大模型的基础,自注意力机制以及其实现Transformer模块。因为Transformer被PyTorch和TensorFlow等框架所支持,所以我们只要能够配置好框架的GPU或者其他加速硬件的支持,就可以运行起来了。

而想运行大模型,恐怕就没有这么容易了,很有可能你需要一台Linux电脑。因为目前流行的AI软件一般都依赖大量的开源工具,尤其是要进行优化的情况下,很可能需要从源码进行编译。一旦涉及到开源软件和编译这些事情,在Windows上的难度就变成hard模式了。

大部分开发者自身都是在开源系统上做开发的,Windows的适配关注得较少,甚至完全不关心。虽然从Cygwin, MinGW, CMake到WSL,各方都为Windows上支持大量Linux开源库进行了不少努力,但是就像在Linux上没有Windows那么多游戏一样,这是生态的问题。

我们先选取几个Windows的兼容性稍好的项目,让用Windows的同学们也可以体验本机的大模型。

Nomic AI gpt4all (基于LLaMA)

2022年末chatgpt横空出世之后,Meta公司认为openai背离了open的宗旨,于是半开放了他们的大模型LLaMA。半开放的原因是,网络的权重文件需要跟Meta公司申请。
LLaMA主要是针对英语材料进行训练,也引用了部分使用拉丁字母和西里尔字母的语言。它的分词器可以支持汉语和日语,但是并没有使用汉语和日语的材料。

因为不并对所有人开放,我们讲解LLaMA是没有意义的。但是我们可以尝试一些基于LLaMA的项目,比如Nomic AI的gpt4all。

gpt4all的贴心之处是针对Windows, M1 Mac和Intel Mac三种平台都进行了适配,当然默认肯定是支持Linux的。而且,推理使用CPU就可以。

下面我们就将其运行起来吧。

首先下载gpt4all的代码:

git clone https://github.com/nomic-ai/gpt4all

第二步,下载量化之后的网络权重值文件:https://the-eye.eu/public/AI/models/nomic-ai/gpt4all/gpt4all-lora-quantized.bin

第三步,将下载的gpt4all-lora-quantized.bin放在gpt4all的chat目录下

第四步,运行gpt4all-lora-quantized可执行文件。以Windows平台为例,就是运行gpt4all-lora-quantized-win64.exe。可以在powershell中执行,也可以直接点击。

运行后,当加载完模型之后,我们就可以跟gpt4all对话了:

下面是gpt4all生成的C++快速排序的代码:

Please generate quick sort algorithm in C++ language
Here’s how you can implement Quick Sort Algorithm using C++ :

// Implementation of QuickSort() function for array A[] with size N and pivot value P[N/2]
void QS(int *A, int n) { // Function prototype declarationif (n <=1 ) return;   /* If there is only one element in the input Array */// QuickSort() function for array A[] with size N and pivot value P[N/2]else{                      //else statement to check condition of quick sort algorithm.int i = n-1, j=0;               /* Indexes used in the loop*/while (i>= 0) {              /* Loop for sorting elements */if(A[j]> A[i]){ // Swap condition to check element's position.int temp = A[i];       // Copying value of array index i into a temporary variable 'temp'.A[i]=A[j];             /* Exchanging values at two indices */}else{// Swap condition to check element's position.int temp = A[j];       // Copying value of array index j into a temporary variable 'temp'.A[i]=A[j], A[j] = temp; /* Exchanging values at two indices */}               i--, j++;             /* Decrement and increment loop indexes*/}; // End of while Loop for sorting elements.}//End if statement to check condition QuickSort() function call with array A[] size N & pivot value P[N/2].

恭喜你!你终于成功在自己的电脑上跑起了一个跟chatgpt一样了不起的预训练大模型。

这个模型虽然能力比chatgpt差了不少,但是它的模型来自LLaMA,训练数据部分取自chatgpt的对话记录,采用了低秩适应(LoRA: Low-Rank Adaptation)和量化的技术来缩减模型大小。每一项技术都是目前的前沿技术。

清华团队的单卡大模型:ChatGLM-6B

清华团队的ChatGLM-6B也是一个目标为运行在单GPU卡上的大模型,其底座为1300万参数的ChatGLM。

下图是2022年10月斯坦福大学对当时主要大模型的评测结果:

从上图数据来看,虽然ChatGLM是落后于InstuctGPT的chatgpt,但是从跟其它模型的比较来看实力还不错。

我们就来试试基于ChatGLM的压缩后的效果。

我们先下载代码:

git clone https://github.com/THUDM/ChatGLM-6B

然后安装其依赖的库:

pip install -r requirements.txt

上面的gpt4all的Python编程接口不支持Windows,而ChatGLM-6B基于Hugging Face Transformer库开发,支持Windows下的Python编程,我们写个代码来调用它吧:

from transformers import AutoTokenizer, AutoModeltokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4-qe", trust_remote_code=True).half().cuda()
model = model.eval()
response, history = model.chat(tokenizer, "用C++实现快速排序", history=[])
print(response)

输出的结果如下:

#include <iostream>
using namespace std;void swap(int& a, int& b) {int temp = a;a = b;b = temp;
}int partition(int arr[], int low, int high) {int pivot = arr[high];int i = (low - 1);for (int j = low; j < high - 1; j++) {if (arr[j] < pivot) {i++;swap(arr[i], arr[j]);}}swap(arr[i+1], arr[high]);return i+1;
}void quicksort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);quicksort(arr, low, pi - 1);quicksort(arr, pi + 1, high);}
}int main() {int arr[] = {5, 2, 9, 1, 6, 3, 8};int n = sizeof(arr) / sizeof(arr[0]);quicksort(arr, 0, n-1);cout << arr[0] << endl;return 0;
}

是不是效果还可以?有点chatgpt的意思了吧?

如果你的PyTorch或者Tensorflow的GPU支持装好了的话,这个推理就是用GPU来完成的。我选用了最省显存的4位量化,如果你的显卡更好,可以选择压缩比更低一些的模型。

这里面我们可以引出Transformer时代的门户,hugging face。我们在上面代码中所使用的from的 transformers库,就是hugging face出品的。

from transformers import AutoTokenizer, AutoModel

hugging face

从上图我们可以看到,Hugging face基本上就是各种Transformer模型的集散地。使用Hugging face的接口,就可以使用基本上所有的开源的大模型。

大模型是如何炼成的

虽然网络权值需要申请,但是Meta的LLaMA大模型的模型代码是开源的。我们来看看LLaMA的Transformer跟我们上一节构造的标准的Transformer有什么区别:

class Transformer(nn.Module):def __init__(self, params: ModelArgs):super().__init__()self.params = paramsself.vocab_size = params.vocab_sizeself.n_layers = params.n_layersself.tok_embeddings = ParallelEmbedding(params.vocab_size, params.dim, init_method=lambda x: x)self.layers = torch.nn.ModuleList()for layer_id in range(params.n_layers):self.layers.append(TransformerBlock(layer_id, params))self.norm = RMSNorm(params.dim, eps=params.norm_eps)self.output = ColumnParallelLinear(params.dim, params.vocab_size, bias=False, init_method=lambda x: x)self.freqs_cis = precompute_freqs_cis(self.params.dim // self.params.n_heads, self.params.max_seq_len * 2)

我们看到,为了加强并发训练,Meta的全连接网络用的是它们自己的ColumnParallelLinear。它们的词嵌入层也是自己做的并发版。

根据层次数,它也是堆了若干层的TransformerBlock。

我们再来看这个Block:

class TransformerBlock(nn.Module):def __init__(self, layer_id: int, args: ModelArgs):super().__init__()self.n_heads = args.n_headsself.dim = args.dimself.head_dim = args.dim // args.n_headsself.attention = Attention(args)self.feed_forward = FeedForward(dim=args.dim, hidden_dim=4 * args.dim, multiple_of=args.multiple_of)self.layer_id = layer_idself.attention_norm = RMSNorm(args.dim, eps=args.norm_eps)self.ffn_norm = RMSNorm(args.dim, eps=args.norm_eps)def forward(self, x: torch.Tensor, start_pos: int, freqs_cis: torch.Tensor, mask: Optional[torch.Tensor]):h = x + self.attention.forward(self.attention_norm(x), start_pos, freqs_cis, mask)out = h + self.feed_forward.forward(self.ffn_norm(h))return out

我们发现,它没有使用标准的多头注意力,而是自己实现了一个注意力类。

class Attention(nn.Module):def __init__(self, args: ModelArgs):super().__init__()self.n_local_heads = args.n_heads // fs_init.get_model_parallel_world_size()self.head_dim = args.dim // args.n_headsself.wq = ColumnParallelLinear(args.dim,args.n_heads * self.head_dim,bias=False,gather_output=False,init_method=lambda x: x,)self.wk = ColumnParallelLinear(args.dim,args.n_heads * self.head_dim,bias=False,gather_output=False,init_method=lambda x: x,)self.wv = ColumnParallelLinear(args.dim,args.n_heads * self.head_dim,bias=False,gather_output=False,init_method=lambda x: x,)self.wo = RowParallelLinear(args.n_heads * self.head_dim,args.dim,bias=False,input_is_parallel=True,init_method=lambda x: x,)self.cache_k = torch.zeros((args.max_batch_size, args.max_seq_len, self.n_local_heads, self.head_dim)).cuda()self.cache_v = torch.zeros((args.max_batch_size, args.max_seq_len, self.n_local_heads, self.head_dim)).cuda()

闹了半天就是支持了并发和加了cache的多头注意力,K,V,Q穿了个马甲,本质上还是多头自注意力。

其它有趣的工程

LM Flow

LM Flow也是最近很火的项目,它是香港科技大学在LLaMA的基础上搞的全流程开源的,可以在单3090 GPU上进行训练的工程。

其地址在:https://github.com/OptimalScale/LMFlow

LMFlow目前的独特价值在于,它提供的流程比较完整。

比如,在目前的开源项目中,LMFlow是少有的提供了Instruction Tuning的工程。

我们来看个Instruction Tuning的例子:

{"id": 0, "instruction": "The sentence you are given might be too wordy, complicated, or unclear. Rewrite the sentence and make your writing clearer by keeping it concise. Whenever possible, break complex sentences into multiple sentences and eliminate unnecessary words.", "input": "If you have any questions about my rate or if you find it necessary to increase or decrease the scope for this project, please let me know.", "infer30b_before_item": " Output: The sentence you are given might be too wordy, complicated, or unclear. Rewrite the sentence and make your writing clearer by keeping it concise. Whenever possible, break complex sentences into multiple sentences and eliminate unnecessary words. If you have any questions about my rate or if you find it necessary to increase or decrease the scope for this project, please let me know.\n---\nInput: Input: The sentence you are given might be too wordy, complicated, or unclear. Rewrite the sentence and make your writing clearer by keeping it concise. Whenever possible, break complex sentences into multiple sentences and eliminate unnecessary words. If you have any questions about my rate or if you find it necessary to increase or decrease the scope for this project, please let me know.\n Output: Output: The sentence you are given might be too wordy, complicated, or unclear. Rewrite the sentence and make your writing clearer by keeping it concise. Whenever possible, break complex sentences into multiple sentences and eliminate unnecessary words. If you have any questions about my rate or if you find it necessary to increase or decrease the scope for this project, please let me know.\n---\nInput: Input: The sentence you are given might be too wordy, complicated,", "infer30b_after_item": " \n Output: If you have any questions about my rate or need to adjust the scope for this project, please let me know. \n\n", "infer13b_before_item": " The sentence you are given might be too wordy, complicated, or unclear. Rewrite the sentence and make your writing clearer by keeping it concise. Whenever possible, break complex sentences into multiple sentences and eliminate unnecessary words. If you have any questions about my rate or if you find it necessary to increase or decrease the scope for this project, please let me know.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", "infer13b_after_item": " \n Output: If you have any questions about my rate or if you find it necessary to increase or decrease the scope for this project, please let me know. \n\n", "infer7b_before_item": " The sentence you are given might be too wordy, complicated, or unclear. Rewrite the sentence and make your writing clearer by keeping it concise. Whenever possible, break complex sentences into multiple sentences and eliminate unnecessary words. If you have any questions about my rate or if you find it necessary to increase or decrease the scope for this project, please let me know.\nInput: The sentence you are given might be too wordy, complicated, or unclear. Rewrite the sentence and make your writing clearer by keeping it concise. Whenever possible, break complex sentences into multiple sentences and eliminate unnecessary words. If you have any questions about my rate or if you find it necessary to increase or decrease the scope for this project, please let me know.\nOutput: The sentence you are given might be too wordy, complicated, or unclear. Rewrite the sentence and make your writing clearer by keeping it concise. Whenever possible, break complex sentences into multiple sentences and eliminate unnecessary words. If you have any questions about my rate or if you find it necessary to increase or decrease the scope for this project, please let me know.\nInput: The sentence you are given might be too wordy, complicated, or unclear. Rewrite the sentence and make your writing clearer by", "infer7b_after_item": " \n Output: If you have any questions about my rate or if you find it necessary to increase or decrease the scope for this project, please let me know. \n\n"}

这让我们见识到了,原来纠错就是这样搞的。这是LLaMA中所缺少的。

HuggingGPT

最近浙大和微软的团队又推出了充分利用Hugging Face的门户中枢地位的Jarvis工程。

HuggingGPT

很不幸的是,上面的两个工程,加上前面工程的高级应用,很难在Windows上面完成。我们后面将统一介绍这些需要在Linux环境下的实验。

小结

  1. 通过对大模型进行剪枝、降秩、量化等手段,我们是可以在资源受限的电脑上运行推理的。当然,性能是有所损失的。我们可以根据业务场景去平衡,如果能用prompt engineer解决最好
  2. HuggingFace是预训练大模型的编程接口和模型集散地
  3. 大模型的基本原理仍然是我们上节学习的自注意力模型

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Chatgpt超级写手批量制作爆款内容霸屏 (01)

有成交需要有转化&#xff0c; 有转化需要有流量&#xff0c; 有流量需要有内容&#xff0c; 好的内容&#xff0c;又是流量和转化的关键。 Chatgpt内容工厂将以好内容为载体&#xff0c; 通过Chatgpt超级写手&#xff0c; 来自动化批量生产好的内容。 什么样的内容是好的内容&…

全自动,真批量——Chatgpt超级写手机器人1.0

Part1用chatgpt写作时常常遇到以下问题&#xff1a; 01.写了一段&#xff0c;没写完就停了 02.停了之后&#xff0c;你发继续写&#xff0c;上下文衔接不上来&#xff0c;甚至毫不相干 03.提问和和回答都需要手动复制粘贴 04.提问次数多了&#xff0c;整理提问回答很麻烦 05.提…

.ART艺术域名遇上 ChatGPT:在线展示您的艺术作品的创新方式

前言 .ART 艺术域名一直走在创新的前沿&#xff0c;不断为创意社区带来技术上的创新和支持。近日&#xff0c;.ART 通过深入人工智能领域&#xff0c;与著名的 ChatGPT 合作以保持在艺术科技行业的领先地位&#xff0c;并为用户提供尖端解决方案。 视觉艺术家 Daniel Arsham 最…

使用railway部署Node项目及遇到的问题

大家好, 今天愚人节, 祝大家节日快乐~ 同时向大家推荐一个非常nice的网站, railway, 它能够免费部署项目, 并且免费的账号. 一个月有20天使用权限, 如果想要更长的时间, 就需要续费, 但是一个月20天免费, 还是非常的划算的. 大家都可以去试试, 并且还有一个好处, 它的域名是…

前端性能优化(提升13倍)

1、背景 有好几个童鞋跟我反馈&#xff0c;你测试平台在线demo加载好慢啊 慢确实是慢&#xff0c;但这事情不能赖我呀&#xff0c;肯定是腾讯云的锅。 腾讯云8m带宽的服务器&#xff0c;可是我斥巨资购入的呀 这可是价值5040元的服务器啊&#xff01;&#xff08;虽然实付只…

(亲试有效)如何完美更换WordPress网站的域名

前几天&#xff0c;一位WordPress王牌主机的用户问我&#xff0c;他的WordPress网站已经建立一年多了&#xff0c;现在想要修改网站使用的域名&#xff0c;该如何操作&#xff1f;这是WordPress用户经常遇到的问题。今天我们来给大家介绍一下&#xff0c;如何更换WordPress网站…

ChatGPT 如何用?12个场景的 Prompts 万能话术模板 四个提问技巧

“AI 不会取代人&#xff0c;只会淘汰不会使用AI的人。” 01 — 昨天的《AI启航实用变现手册》发出去后&#xff0c;有朋友问怎么用 ChatGPT 解决我的问题呢&#xff1f;遇到的场景是这样的&#xff1a;‍‍‍‍‍‍‍‍‍‍ “教育机构&#xff0c;老学员8月份续费活动都有哪些…

ChatGPT Plus停售!地球已经没有足够的算力来满足需求了

杨净 发自 凹非寺量子位 | 公众号 QbitAI 刚续费不到2周的账号&#xff0c;现在登录不上了去了。了解一圈后发现&#xff0c;GPT Plus都停售了&#xff0c;GPT 4.0 太消耗算力&#xff0c;不知道是真是假&#xff0c;或另有隐情&#xff01; 网络上众说风云&#xff0c;比如&am…

8个升级到ChatGPT Plus的理由,不升级你就out了

​关注文章下方公众号&#xff0c;可免费获取AIGC最新学习资料 导读&#xff1a;ChatGPT Plus 是 OpenAI 聊天机器人的高级付费版本。以每月 20 美元的价格&#xff0c;该服务为您提供访问 GPT-4&#xff0c;您可以享有令人难以置信的稳定性和更快的响应时间。 本文字数&#…

ChatGPT与Claude对比分析

一 简介 1、ChatGPT: 访问地址&#xff1a;https://chat.openai.com/ 由OpenAI研发,2022年11月发布。基于 transformer 结构的大规模语言模型,包含1750亿参数。训练数据集主要是网页文本,聚焦于流畅的对话交互。对话风格友好,回复通顺灵活,富有创造性。存在一定的安全性问题,可…

小提琴 吉他 二胡 钢琴曲谱智能应用开发 五线谱 六线谱 四线谱简谱播放识别SDK

智域智联科技致力于用“智能化教学 音乐软件模块”及“在线教育AiScore 平台”赋能传统音乐教育&#xff0c;使音乐教 育机构智能化教育转型成为可能。 AifbdScore是一个跨平台的声音识别和评 测库&#xff0c;运用人工智能深度学习算法采集各 种乐器不同音高的时域、频域特征训…

【收集】键盘钢琴 和弦琴谱 (带HTML版开发流程)

目录 键盘钢琴开发 《御剑江湖》 《星之所在》 《童话》 《一直很安静》 《雨的印记》 《天空之城》 《苍海一声笑》 《卡农》 《Tifa Theme》(under construction) 键盘钢琴开发 烦闷中&#xff0c;何以解忧&#xff1f;听君一曲&#xff0c;莫问秋…… 顺着找到的V…

基于 Python 的音乐流派分类

音乐就像一面镜子&#xff0c;它可以告诉人们很多关于你是谁&#xff0c;你关心什么&#xff0c;不管你喜欢与否。我们喜欢说“you are what you stream” - Spotify Spotify 拥有 260 亿美元的净资产&#xff0c;是如今很受欢迎的音乐流媒体平台。它目前在其数据库中拥有数百万…

语谱图(二) Spectrogram 的产生

1. 信号预处理部分 预处理部分中 包括 预加重分帧加窗 &#xff1b; 1.1 读取音频数据 python可以用librosa库来读取音频文件&#xff0c;但是对于MP3文件&#xff0c;它会自动调用audio_read函数&#xff0c;所以如果是MP3文件&#xff0c;务必保证将ffmpeg.exe的路径添加…

一网打尽,音乐高手都在使用的打谱软件不藏私推荐

一网打尽,音乐高手都在使用的打谱软件不藏私推荐 关键词&#xff1a;打谱软件&#xff0c;Guitar Pro&#xff0c;Overture&#xff0c;Sibelius&#xff0c;Finale Guitar Pro:sourl.cn/KsuXZz Overture:sourl.cn/VsYZ3y Sibelius:sourl.cn/2fyfZt 学音乐的大家都知道&am…

WaveTone 2.67原创汉化版扒谱辅助教程

深度解析音频结构 精准扒谱&#xff0c;扒和弦分析&#xff01; WaveTone 是音频后期制作&#xff0c;深度学习编曲的好助手&#xff01; 汉化版支持中英文自由切换&#xff0c;重启应用程序生效&#xff01; 支持导出主流音频Wav格式和MIDI键盘记录文件&#xff01;可以在…

【Musescore 】开源打谱软件 快速入门笔记

前两天做了个西贝柳斯的打谱软件学习笔记&#xff0c;反正都是初学&#xff0c;今天再来学习一款同类软件&#xff0c;比较之后确定一款深入学习。 西贝柳斯的学习笔记在此&#xff1a;https://blog.csdn.net/yuetaope/article/details/120020342 西贝柳斯是商业收费软件&#…

Guitar Pro8.1专业版新功能简谱介绍

Guitarpro 8.1版本中&#xff0c;已成功推出全新的简谱功能&#xff01;Guitar Pro是一款非常流行的音乐制谱软件&#xff0c;它支持各种乐器的制谱。在思杰马克丁引入这款软件之后&#xff0c;为它专门定制了中文版&#xff0c;并针对中国用户重新定价。GuitarPro经过5年研发&…

吉他谱软件guitar pro2023吉他和弦、六线谱、BASS四线谱绘制

Guitar Pro由法国Arobas Music出品&#xff0c;主要用于管弦乐器的学习&#xff0c;通过建立不同的音轨&#xff0c;可完成不同乐器乐谱的编排制作。Guitar Pro发布23余年来&#xff0c;其强大的功能被广泛应用于专业乐队的创作和排练&#xff0c;其独创的gtp文档格式在专业领域…

谷歌推出全能扒谱AI:只要听一遍歌曲,钢琴小提琴的乐谱全有了

晓查 发自 凹非寺量子位 报道 | 公众号 QbitAI 听一遍曲子&#xff0c;就能知道乐谱&#xff0c;还能马上演奏&#xff0c;而且还掌握“十八般乐器”&#xff0c;钢琴、小提琴、吉他等都不在话下。 这就不是人类音乐大师&#xff0c;而是谷歌推出的“多任务多音轨”音乐转音符模…