草庐IT

保姆级教程:用GPU云主机搭建AI大语言模型并用Flask封装成API,实现用户与模型对话

jingdongkeji 2024-01-13 原文

导读

在当今的人工智能时代,大型AI模型已成为获得人工智能应用程序的关键。但是,这些巨大的模型需要庞大的计算资源和存储空间,因此搭建这些模型并对它们进行交互需要强大的计算能力,这通常需要使用云计算服务。从云产品性能上来看,GPU云主机是最适合的工具之一,对于业务方或者个人开发者来讲,使用GPU云主机搭建AI大语言模型有以下优势:

•高性能计算:GPU云主机提供了高性能GPU处理器,加速模型的训练和推理;

•高性价比:灵活资源管理、可扩展性、弹性伸缩等云计算优势,根据业务或个人训练的需要,快速调整计算资源,满足模型的训练和部署需求;

•开放性:云计算的开放性让用户更容易进行资源的共享和协作,为AI模型的研究和应用提供了更广泛的合作机会;

•丰富的API和SDK:云计算厂商提供了丰富的API和SDK,使得用户能够轻松地接入云平台的各种服务和功能,进行定制化开发和集成。

在本文中,我们将以chatglm-6b为例详细介绍GPU云主机搭建AI大语言模型的过程,并使用Flask构建前端界面与该模型进行对话。

整个流程也比较简单:配置GPU云主机 → 搭建Jupyterlab开发环境 → 安装ChatGLM → 用Flask输出模型API

一、Start:配置GPU云主机

GPU 云主机(GPU Cloud Virtual Machine )是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,在深度学习、科学计算、图形图像处理、视频编解码等场景被广泛使用。GPU驱动,提供大量的GPU内存和强悍的计算性能,非常适合运行深度学习应用程序。

相对于实体卡,一张售价一般都是几万左右,而GPU云主机费用门槛很低,按时计费,一小时才十几元,可以根据自己的需求调配。

•本次选取的是P40卡: https://www.jdcloud.com/cn/calculator/calHost

•系统环境:Ubuntu 20.04 64位

二、搭建Jupyterlab开发环境

下载Anaconda包需要在终端里执行以下命令:

mkdir anaconda # 创建文件夹
cd anaconda # 进入文件夹
wget https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-x86_64.sh # 下载安装包
bash Anaconda3-2023.03-Linux-x86_64.sh # 安装

也可以用清华源,速度更快:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.03-Linux-x86_64.sh

接下来进行环境变量设置

cd /root/anaconda3/bin
vim ~/.bashrc

在.bashrc下添加以下内容:#Anaconda
export PATH="/root/anaconda3/bin:$PATH"

然后退出编辑

source ~/.bashrc


conda create -n jabari python=3.8  安装python3.8版本
# 创建环境
jupyter lab --generate-config

# 生成配置文件

Writing default config to: /root/.jupyter/jupyter_lab_config.py

[root@lavm-ba6po1r9fh bin]# vim /root/.jupyter/jupyter_lab_config.py 



# 编辑配置文件

c.ServerApp.ip = '*' # 设置访问的IP地址

c.ServerApp.open_browser = False  

# 不自动打开浏览器

c.ServerApp.port = 6888   #(自己可以自己设置端口,这里设置了6888)

# ServerApp的端口号

c.MappingKernelManager.root_dir = '/root/jupyter_run' 

# 设置Jupyter Notebook的根文件夹

c.ServerApp.allow_remote_access = True 

# 允许远程访问

c.ServerApp.password = '' 

# 不设置登录密码

c.ServerApp.allow_origin='*' 

# 允许任何来源的请求

c.ServerApp.password_required = False 

# 不需要密码

c.ServerApp.token = ''

# 不设置验证token



jupyter lab --allow-root # 启动JupyterLab

之后,在本地浏览器输入"服务器ip:端口号"访问即可:

也可以安装汉化软件:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jupyterlab-language-pack-zh-CN

三、重点来了:开始安装ChatGLM语言模型

https://huggingface.co/THUDM/chatglm-6b

ChatGLM-6B 是一个开源的、支持中英双语问答的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 ChatGLM 相同的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。

先安装语言依赖

pip install protobuf==3.20.0 transformers==4.27.1 icetk cpm_kernels

然后在jupyter运行代码

from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
response, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=history)
print(response)



这里会直接从huggingface.co下载

最终下载完后,再次运行,提示

这里需要安装显卡驱动同时还要安装nvidia-cuda-toolkit

NVIDIA CUDA Toolkit 提供了一个开发环境,用于创建高性能 GPU 加速应用程序。

apt install nvidia-cuda-toolkit

再次运行,已经ok了,出现模型回复内容

这里在命令行输入nvidia-smi 也看下显卡类型:

四、用Flask输出模型API

app.py的代码如下:

from gevent import pywsgi
from flask import Flask
from flask_restful import Resource, Api, reqparse
from transformers import AutoTokenizer, AutoModel
from flask_cors import CORS

app = Flask(__name__)
CORS(app, resources={r"/api/*": {"origins": "*"}})
api = Api(app)

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()

parser = reqparse.RequestParser()
parser.add_argument('inputs', type=str, help='Inputs for chat')
parser.add_argument('history', type=str, action='append', help='Chat history')

class Chat(Resource):
    def post(self):
        args = parser.parse_args()
        inputs = args['inputs']
        history = args['history'] or []

        response, new_history = model.chat(tokenizer, inputs, history)
        return {'response': response, 'new_history': new_history}

api.add_resource(Chat, '/api/chat')
if __name__ == '__main__':
    server = pywsgi.WSGIServer(('0.0.0.0', 80), app)
    server.serve_forever()



最后在Terminal 里 执行python 目录地址/app.py

客户端,开发者可以通过API来获取数据:

五、前端效果:问问五一去哪玩!

你可以自定义UI效果,比如胡老师用5分钟搞定的Demo——

有关保姆级教程:用GPU云主机搭建AI大语言模型并用Flask封装成API,实现用户与模型对话的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  7. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  8. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  9. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  10. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

随机推荐