上一章里,我拿一堆电子垃圾级别的旧显卡攒了一台看起来相当离谱的家用服务器,专门用来跑AI语言模型。这一篇要聊的是,为了从这套配置里挤出一点像样的性能,我到底做了哪些事。这里用的都是现成代码和现成技巧,主要是在llama.cpp的设置里反复折腾;自己动手写新的ROCm内核不在本章范围内。
先交代一点背景
![]()
如果你已经清楚Transformer模型是怎么工作的,可以直接跳到第二部分。如果你已经了解多GPU并行是怎么一回事,只想看我实际测试的部分,那就直接跳到第三部分。
![]()
现在市面上几乎所有正在使用的AI文本生成软件,本质上都是“Transformer模型”或者说“大语言模型”。这套设计和基础技术来自论文《Attention is All You Need》,这篇论文大概是过去二十年里计算机科学领域最重要的一篇。按论文的标准来看,它其实算相当好读的。我猜每个读到这篇博客的软件工程师,应该都已经读过了吧?对吧?
不管怎样,我在这里会做一些过度简化,重点站在一个想让这些东西在破烂硬件上跑得更快的人的角度来讲,不会深入张量数学,也不太会聊模型训练,因为这篇博客本身已经注定会非常非常长了。
模型怎么处理文字
![]()
大语言模型是以“token”为单位工作的。一个token基本上就是一个词片段;与其一个字母一个字母地输入和输出,不如把文字切成一段段字母序列,再让模型去处理这些片段,这样效率更高。这也是为什么早期AI模型在回答“raspberry这个词里字母R出现了多少次”这类问题时表现很差。不同模型对语言的切分方式不一样,你可以把这理解成一种频率编码。模型每生成一个token时,实际上会先产出一个概率分布,然后从这个分布里随机采样一个,因为这样生成的语言效果比每次都挑概率最高的下一个词要好。
语言模型是一个被分成多层的神经网络。它有一个输入层、一个输出层,中间夹着一堆不直接接触输入或输出的“隐藏层”。输入层接收整个输入提示,然后每一层依次对上一层的输出做数学运算。模型一次性查看整个输入、并观察输入序列中不同位置token之间关系的机制,就叫“注意力机制”。如果你读过关于AI语言模型的内容,大概听过有人信誓旦旦地说“这些AI模型不过是下一个词生成器,跟马尔可夫链一样”,然后你大概也注意到,这些AI模型生成的结果和马尔可夫链完全不同,并且会好奇差别到底在哪里。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.