前言
看了那么多 chatGPT 的文章,作为一名不精通算法的开发,也对大模型心痒痒。但想要部署本人的大模型,且不说没有算法相干的教训了,光是大模型占用的算力资源,手头的个人电脑其实也很难独立部署。就算应用算法压缩后的大模型,部署在个人电脑上,还要忍耐极其迟缓的计算速度以及与 chatGPT 相差甚远的模型成果。
有什么方法可能部署属于咱们本人的大模型呢?其实很简略,咱们将指标拆解一下:
- 有编程根底:作为一个合格的程序员,这应该是必备素质。
- 有足够的算力资源:业余 GPU 本人买不起怎么办,阿里云最近推出了”飞天“收费试用打算,AI 模型训练,GPU 资源收费用!
- 要懂大模型:真的要精通大模型吗?不须要。如果只是简略的模型部署和应用,当初的开源模型部署曾经十分简单化,只须要把握根底的 Python 常识就能够。
随着 chatGPT 的火爆,许多开源爱好者涌入 AI 畛域,将许多与大型模型相干的工具进行进一步封装,使得咱们这些 AI 初学者也可能用很少的工作量搭建一个公有大型语言模型。而且,有许多成熟的工具可供咱们应用,能够帮忙咱们进一步应用和微调大型模型。
因而,本文是为 AI 初学者们(包含我本人)编写的保姆级大型模型部署和使用指南。当初正值阿里云收费试用打算,咱们能够不花一分钱就能够体验部署本人的大型模型的乐趣。
下图便是我通过阿里云收费申请的 PAI 平台资源(显卡是 Nvidia V100),部署的清华大学 chatGLM 对话大模型,在网页端和手机端都能间接体验:
电脑端
手机端
下文围绕如何手把手搭建一个大模型 Demo 开展,文章次要目录:
- 支付阿里云收费应用资源
- 创立并应用 PAI 平台实例
- 部署清华 ChatGLM 大模型
- 加餐:收费额度用量查问
- 总结和瞻望
支付阿里云收费应用资源
收费试用流动页
https://free.aliyun.com/
只有没有申请过 PAI-DSW 资源的新老用户皆可申请 5000CU 的收费额度,3 个月内应用。
至于 5000CU 能用多久,和理论申请实例的性能相干,在上面会解说。
创立并应用 PAI 平台实例
官网有 PAI-DSW 应用教程,教你如何用支付的免费资源搭建一个 Stable Diffusion 来做 AI 画图,如果对 SD 感兴趣,能够依照官网教程实际。
https://help.aliyun.com/document_detail/615220.html
咱们支付额度后,秒到账。之后在阿里云页面内搜寻 PAI 平台,点击立刻开明,开明 PAI 控制台。
开明时的页面没有截图,其中有一些可选的开明项,比方 NAS,比方网关等,能够依照本人需要选取,比方心愿保留本人的模型,那能够关联 NAS 资源。我过后没有选其余资源,仅开明了 PAI,这样没有额定的免费。
随后进入控制台,创立 DSW 实例。
这里选取资源,留神抉择 GPU 资源,并抉择反对资源包抵扣的资源。比方下图的 ecs.gn6v-c8g1.2xlarg。能够看到他们的价格里,写明了每小时耗费的 CU,你能够大抵计算一下,5000CU 能够用多久,ecs.gn6v-c8g1.2xlarg 这个型号能够跑 333 小时,大略间断 13 天。
零碎能够任意抉择,本文为了部署 chatGLM,抉择 pytorch1.12
当然,两头你能够 随时进行机器,就不会持续扣费。留神,这里的机器,是只有系统盘的,如果进行了机器,挂载的系统盘会被回收,你在下面下载的各种文件,模型,都会回收掉。你重新启动,是新的系统盘,文件须要从新下载。(别问我怎么晓得的 - -!)
创立实现后,点击关上,就进入了交互式的 Web 页面,能够开始你的模型开发之旅。
部署清华 ChatGLM 大模型
下面曾经讲完了资源的申请和实例的创立、应用,之后小伙伴们能够自行施展,部署本人的大模型(或者任何 AI 相干资源)。本文后半局部介绍一下我本人折腾部署 ChatGLM 对话大模型的过程,给齐全不理解大模型的小伙伴打个样。
ChatGLM 代码仓库:
https://github.com/THUDM/ChatGLM-6B
大家齐全能够依照官网文档自行部署,疏忽我上面的教程。也能够依照我下方的流程来操作,防止再把我踩得坑再踩一遍。
下载模型
因为模型较大(13G 左右),咱们最好先把模型拉到本地,再运行。
当然,如果你也能够不下载离线模型,间接在运行时拉取模型文件。
模型文件仓库:
https://huggingface.co/THUDM/chatglm-6b
下载模型仓库,须要装置 Git LFS(Large File Storage),它用来拉去 Git 仓库中的大型文件,比方这次用到的模型 bin 文件。
因为咱们申请的零碎正好是 Ubuntu,在 Ubuntu 下装置 Git LFS,能够应用如下命令:
sudo apt-get update
sudo apt-get install git-lfs
实现后,克隆模型仓库:
git clone https://huggingface.co/THUDM/chatglm-6b
有可能网络稳定,会导致拉取卡住,能够手动进行掉,而后进入文件夹内:
git lfs pull
这样会拉取到上图红框中 LFS 文件。
部署模型
实现模型下载后,咱们下载模型运行代码:
git clone https://github.com/THUDM/ChatGLM-6B.git
进入文件夹,创立 python 的虚拟环境:
virtualenv -p /usr/bin/python3.8 venv
激活 Python 虚拟环境:
source venv/bin/activate
如果遇到如下的报错,须要额定装置一下 python3-dev:
Could not build wheels for pycocotools, which is required to install pyproject.toml-based projects
error: command ‘/usr/bin/x86_64-linux-gnu-gcc’ failed with exit code 1
sudo apt-get install python3-dev
因为咱们本地提前下载好了模型,咱们批改一下代码,应用本地模型的门路。
将应用到的代码中,门路都从 THUDM/chatglm-6b 改为你的门路,比方咱们的模型下载在 /mnt/workspace/chatglm-6b,咱们将两种部署模型的主代码文件都批改一下,都批改为如下图所示的门路:
- cli_demo.py: 命令行交互界面
- web_demo.py:Web 图形交互界面
咱们间接用官网提供的网页版 Demo 来跑模型,启动 web_demo.py,开始模型部署,首先会将模型读入内存,占用约 13 个 G。
实现后,内存会被开释,开始占用 GPU 显存 13g。
最终,部署实现会失去服务公网和本地网址。
对话成果展现
答复还是比拟快的,在咱们 V100 显卡的机器上,发问后 1 - 2 秒内就会开始答复问题。
以下是一个残缺的对话:
我:写一个 Java 单例模式代码
ChatGLM:以下是一个简略的 Java 单例模式代码示例:
public class Singleton {private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {return INSTANCE;}
}
在这个示例中,Singleton 类是一个动态类,它有一个动态成员变量 INSTANCE,它初始化为一个单例对象。getInstance 办法返回这个单例对象的实例,能够像任何其余办法一样应用。
单例对象通常被用于确保一个类只有一个实例,并提供全局拜访点。应用 getInstance 办法能够不便地获取单例对象,而无需放心多个线程同时拜访同一个对象。
须要留神的是,在理论利用中,单例对象应该尽量避免被频繁创立和销毁,因为这样会减少内存开销和保护老本。因而,能够思考应用懒加载 (lazy loading) 的形式来防止频繁创立单例对象。
我:能够换一个形式实现吗,比方懒汉式?
ChatGLM:当然能够,懒汉式单例模式的具体实现形式如下:
- 将 Singleton 类做成一个接口。
- 实现 Singleton 接口的类能够是多个,但它们都应该应用 getInstance 办法来获取单例对象,并返回一个指向该对象的援用。
- 实现 Singleton 接口的类中,能够有一个外部类来负责创立单例对象。
- 外部类应该实现 static 关键字,并应用 synchronized 关键字实现线程平安。
- 外部类应该笼罩 getInstance 办法,以实现懒加载。例如,能够创立一个动态变量来存储单例对象,并在须要时才创立该变量。
- 在须要应用单例对象的中央,能够调用外部类的办法,来获取单例对象。
以下是一个懒汉式单例模式的示例代码:
public interface Singleton {static Singleton INSTANCE;}
public class ConcreteSingleton implements Singleton {private static Singleton INSTANCE = new ConcreteSingleton();
@Override
public Singleton getInstance() {return INSTANCE;}
}
public class LazySingleton implements Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {synchronized (LazySingleton.class) {return INSTANCE;}
}
}
在这个示例中,ConcreteSingleton 类应用 getInstance 办法来创立单例对象,并应用 synchronized 关键字实现线程平安。LazySingleton 类应用 synchronized 关键字实现懒加载,只有在须要时才创立单例对象。
须要留神的是,懒汉式单例模式依然须要保障线程平安,因而在应用懒加载时,须要思考线程平安问题。此外,懒汉式单例模式可能无奈充分利用类的空间,因为它须要应用共享对象来实现懒加载,因而须要思考如何进步类的性能和空间利用率。
查看收费额度使用量
收费的 5000CU 额度是有三个月时效的,超过三个月会间接过期。想要做到成竹在胸,避免超过收费额度导致扣费。咱们能够查看收费额度的用量。在页面右上角有“费用”标签,抉择“资源实例治理”,点击“资源包”,能看到你的免费资源包的用量。
点击每行中的统计,能够看到是哪个实例在耗费 CU。
总结
整个部署流程,我本人折腾下来也只花了半天工夫, 就可能搭建好一个残缺、可用的 Demo。
不得不说,当 AI 逐步破圈,成为一个风口时,真的是猪都会飞,一般程序员上手 AI 的难度霎时被拉低了一个数量级。开源开发者的一直奉献让各种工具和文档变得更容易上手。每天数以万计的大模型相干 issue 和 pr,让 Github 遇到了久违的凋敝。
在 AI 席卷寰球的这一刻,作为一名程序员,咱们无疑是对这个时代更有体感的那群人。此时此刻,非我莫属。要充沛关注 AI 技术的利用场景和发展趋势,积极探索 AI 与其余畛域的联合,为本人的职业倒退和将来布局提供更多的可能性。