超详细教程:如何在笔记本上run起大模型?没有GPU也可以!(Windows/Mac)

news2024/9/22 2:09:55

在笔记本上Run起大模型

  • 好久不见的前言
  • 环境搭建
    • Mac环境搭建
      • conda环境
      • python环境
        • 安装pytorch
        • 安装transformers
    • Windows环境搭建
      • conda环境 (可选)
      • python环境
  • 模型下载
    • 方式一:通过git下载
    • 方式二:直接通过文件链接下载
    • 方式三:通过huggingface官方提供的模型的下载工具snapshot_download进行下载。
  • 模型加载
  • Tokenizer加载
  • 执行推理
  • 结束语

好久不见的前言

好久没更新了,一是最近一直在研究生物医药大模型相关的内容,二是。相信不止是我,每一位工程师朋友都已经感受到大语言模型带给整个行业的颠覆性改变。最近身边就有不少的小伙伴入坑了大模型技术,而即使仍在观望的同学,也对大模型这一崭新的技术表达了深厚的兴趣。

但说到上手使用大模型,尤其是对于之前没有从事过相关工作的小伙伴来说,门槛是不低的。比如,大模型对基本硬件要求很高,没有大的内存和高性能的GPU就很难玩转,层出不穷的各种新技术和工具更是让人不知道从何入手。

因此,以最近刚刚发布的生物医药大模型——BioMedGPT为例,本教程提供了接触大模型技术的第一步,整理和介绍了在MacBook和Windows笔记本上如何从头开始跑起一个大模型,当然里面用到的技术也同样适用于对其他大模型进行操作。

接下来,我将从如何从零在MacBook和Windows笔记本配置隔离的运行环境,如何从HuggingFace上下载模型、加载模型,以及生成文本(执行推理)几个部分进行介绍。对于有python开发经验的伙伴们,可以选择性阅读。


环境搭建

Mac环境搭建

Mac配置

以本人所使用的MacBook Pro (13-inch, M1, 2020)为例
芯片:Apple M1
内存:16 GB
核总数:8(4性能和4能效)
系统:macOS Monterey,12.6.2
CPU架构:x86_64

conda环境

Anaconda是管理Python环境的强大工具,通过其可以创建、管理多个相互独立、隔离的Python环境,并在环境中安装、管理Python依赖。我们可以使用其免费、最小可用版本MiniConda。
可以在Miniconda ‒ conda documentation找到对应的下载链接和安装方式。
在这里插入图片描述

python环境

安装好miniconda以后,我们就可以创建一个Python环境,我们在这里创建了一个名为biomedgpt的python环境,并通过conda activate激活该环境。

conda create -n biomedgpt python=310
conda activate biomedgpt

为了运行BioMedGPT-LM-7B,我们需要安装pytorch和transformers。

安装pytorch

Mac上安装Pytoch可以在pytorch官网上找到对应的命令。我们只需要按照下图所示选择对应的版本,然后使用官方给出的安装命令即可。pip install torch torchvision torchaudio
在这里插入图片描述

安装transformers

Huggingface提供数以千计针对于各种任务的预训练模型,这些模型被广泛的应用于学术研究当中,transformers是Huggingface开源的一个NLP工具,方便使用者调用这些模型(包括训练、推理、量化等)。
在这里插入图片描述
大家可以根据自身的需要,选择适合自己的模型进行训练或微调,也可阅读api文档和源码, 快速开发新模型。我们可以通过pip或者conda直接安装transformers。

pip install transformers

如果pip安装很慢,可以指定清华或者阿里等国内镜像源,下面以清华源为例

pip install transformers -i https://pypi.tuna.tsinghua.edu.cn/simple

Windows环境搭建

conda环境 (可选)

conda提供了两个核心能力:一个是做环境隔离,一个是管理你的安装包。强烈推荐配置conda环境,它可以为你创建一个虚拟环境,最大限度地避免各种环境冲突。
访问 https://docs.conda.io/en/latest/miniconda.html 下载Miniconda:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如下图,启动conda命令界面:
在这里插入图片描述
在这里插入图片描述
上面截图中的信息表示,初始的时候,conda info --envs命令显示,系统中只有一个名叫“base”的虚拟环境。而在执行了 conda create --name BioMedGPT-env 命令之后,系统中就创建出来一个名叫“BioMedGPT-env”的虚拟环境。下面我们安装所需要的软件包,都会安装到这个虚拟环境下。

然后使用 conda activate BioMedGPT-env 命令激活这个新的虚拟环境。
在这里插入图片描述
安装python。这一步比较关键,它会确保你的python运行环境从零开始创建,不会受电脑上已经存在的其他python包的影响。
在这里插入图片描述

python环境

下面安装一系列需要的python包。本教程为了简单,只需要安装4个python包:torch、transformers、xformers、accelerate。下面执行 pip install 命令进行安装。为了加快从网上下载安装包的速度,用“-i”命令选项指定一下清华的安装镜像地址。

pip install torch transformers xformers accelerate -i https://pypi.tuna.tsinghua.edu.cn/simple

模型下载

BioMedGPT-LM-7B开源在PharMolix/BioMedGPT-LM-7B。
在这里插入图片描述
可以通过transformers的AutoModelForCausalLM.from_pretrained自动下载需要的模型和tokenizer。

import transformers
model =  AutoModelForCausalLM.from_pretrained("PharMolix/BioMedGPT-LM-7B")

但这种方式速度慢,且经常中断,因此我们也介绍了其他几种下载方式。

方式一:通过git下载

如果你的电脑上还没有安装git,首先安装git。

brew install git

由于模型文件很大,还需要安装Git Large File Storage。

brew install git-lfs

然后可以通过git clone的方式下载。
在这里插入图片描述

直接在终端执行git clone https://huggingface.co/PharMolix/BioMedGPT-LM-7B,即可将仓库中所有文件下载到本地。

方式二:直接通过文件链接下载

我们可以进入到PharMolix/BioMedGPT-LM-7B的文件页面。点击文件的下载箭头,就可以直接把文件下载到本地。
在这里插入图片描述
需要下载的文件如下,包含了模型和tokenizer所必需的文件。

 pytorch_model-00001-of-00003.bin
 pytorch_model-00002-of-00003.bin
 pytorch_model-00003-of-00003.bin
 pytorch_model.bin.index.json
 special_tokens_map.json
 config.json
 generation_config.json
 tokenizer.json
 tokenizer.model
 tokenizer_config.json

方式三:通过huggingface官方提供的模型的下载工具snapshot_download进行下载。

from huggingface_hub import snapshot_download
snapshot_download(repo_id="PharMolix/BioMedGPT-LM-7B")

snapshot_download提供了很多参数,比如你可以通过allow_patterns参数来决定你要下载的文件,resume_download设置为True则可以继续上次中断的下载。更多参数细节请参考官方文档。

from huggingface_hub import snapshot_download
#只下载json文件
snapshot_download(repo_id="PharMolix/BioMedGPT-LM-7B", 
                  allow_patterns="*.json",
                  resume_download=True)

我们使用Hugging Face提供的transformers框架来加载模型以及必需的其它配置。

模型加载

现在,我们已经准备好了环境和相应的文件,也已经启动了一个jupyter notebook用来编写代码。BioMedGPT-LM-7B是基于meta-llama/Llama-2-7b,在生物医药语料上增量训练得到的,模型的加载方式和llama2-7B模型的加载方式一致。我们可以直接通过transformers进行模型的加载。也可以直接print(model)把模型结构打印出来,具体的模型细节可以查看llama2官网和技术报告。

我们执行以下代码。为了适当暴露加载模型的一些细节,达到教学目的,我们特意单独加载模型和tokenizer,然后采用一个pipeline来把它们串起来(细节见下面的分步骤讲解)。

from transformers import pipeline
from transformers import AutoTokenizer
from transformers import LlamaForCausalLM
import torch

model = LlamaForCausalLM.from_pretrained("PharMolix/BioMedGPT-LM-7B", low_cpu_mem_usage=True)
tokenizer = AutoTokenizer.from_pretrained("PharMolix/BioMedGPT-LM-7B")
pipe = pipeline(task = "text-generation", model = model, tokenizer = tokenizer)

在这里插入图片描述
transformers.AutoModelForCausalLM的from_pretrained函数可以从huggingface仓库直接下载模型也可以加载本地下载好的模型。model_path是你存放模型和tokenizer文件的路径。运行上面的代码,我们就成功的在mac笔记本上加载了BioMedGPT-LM-7B模型,我们可以直接打印模型,查看模型的具体信息。如果提示内存不足,建议先关掉其他不需要的进程。

Tokenizer加载

如下图所示(来源于huggingface官方文档),文本在传入到模型到输出结果,需要经过三个步骤。Tokenizer把输入的文本切分成一个一个的token,然后将token转变成向量,Model负责根据输入的变量提取语义信息,输出logits;最后Post Processing根据模型输出的语义信息,执行具体的nlp任务,比如情感分析,文本分类等。

因此,我们需要加载两个核心的对象,一个是模型,一个是tokenizer。在上面代码中,model变量存储了模型本身。而tokenizer的作用是对于模型输入的自然语言文本做预处理(preprocessing)。由于计算机只能对数字进行处理(语言模型也不例外),而我们的输入是自然语言,因此需要一个tokenizer来把文本转成计算机能够处理的数字(最终转成向量的形式,喂给模型)。

在这里插入图片描述
tokenizer相关文件和模型文件都在BioMedGPT-LM-7B/文件夹下。其中,tokenizer.json存放了tokenizer的词表,tokenizer_config.json里有tokenizer的相关参数,tokenizer.model则存放着模型参数。 使用tokenizer处理输入的文本得到模型需要的向量表示。
在这里插入图片描述
input_ids就是每个token对应的词表id,把其作为模型的输入,得到输出的token id,然后通过tokenizer的decoder方法将output解码成文字。
在这里插入图片描述

执行推理

好了,至此,我们终于可以调用模型来生成文本了。我们调用前面的pipe,向模型输入一个问句:“What’s the function of Aspirin?” (翻译:如何设计一款药物?),回答见上图。

结束语

至此,我们成功地在笔记本上加载了7B的大模型,并用来生成了一段文字。注意,由于本教程在笔记本上使用CPU执行,而7B的模型有70亿参数之多,model.generate这步模型推理过程非常耗时,需要耐心等待结果输出(可能需要执行2个小时)。因此,下一篇文章,我们将会和大家一起讨论如何在使用模型的过程中进行加速,包括对模型进行量化和使用GPU。后面我们也会介绍更多的内容给大家,包括如何使用BioMedGPT-LM-7B构建一个医药助手。敬请期待~

下面的二维码,是我们BioMedGPT大模型的官方GitHub地址。本文的教程代码,都在里面的example目录下。后续的教程系列的代码也会持续更新到这个repo中。在手机上阅读的朋友,可以扫码进去star一下,方便后面查阅。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LangChain-Chatchat:基于LangChain和ChatGLM2-6B构建本地离线私有化知识库

如果你对这篇文章感兴趣,而且你想要了解更多关于AI领域的实战技巧,可以关注「技术狂潮AI」公众号。在这里,你可以看到最新最热的AIGC领域的干货文章和案例实战教程。 一、前言 自从去年GPT模型火爆以来,降低了很多个人和企业进入…

09-微信小程序 网络请求API(实现轮播广告和简易的聊天窗口)

09-微信小程序API网络请求(实现轮播广告和简易的聊天窗口) 文章目录 微信小程序API服务器域名配置注意网络相关APIrequestRequestTask 请求任务对象object.success 回调函数object.fail 回调函数案例代码(实现轮播图) WebSocket案例代码(实现…

Vue:插槽,与自定义事件

1.插槽slot <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <div id"app"><!-- <p>列表书籍</p>--> <!-- …

【【STM32分析IO该设置什么模式的问题】】

STM32分析IO该设置什么模式的问题 我们分析而言 我们对于PA0 的设计就从此而来 对于边沿触发的选择我们已经有所了解了 我们下拉&#xff0c;但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发 而对于KEY0 我们摁下是使得电路从原来悬空高阻态到地就是0 所以…

如何选择合适的损失函数

目录 如何选择合适的损失函数 1、均方误差&#xff0c;二次损失&#xff0c;L2损失&#xff08;Mean Square Error, Quadratic Loss, L2 Loss&#xff09; 2、平均绝对误差&#xff0c;L1损失&#xff08;Mean Absolute Error, L1 Loss&#xff09; 3、MSE vs MAE &#xff…

C++--两个数组的dp问题(2)

1.交错字符串 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定三个字符串 s1、s2、s3&#xff0c;请判断 s3 能不能由 s1 和 s2 交织&#xff08;交错&#xff09; 组成。 两个字符串 s 和 t 交织 的定义与过程如下&#xff0c;其中每个字符串都…

matlab使用教程(26)—常微分方程的求解

1.求解非刚性 ODE 本页包含两个使用 ode45 来求解非刚性常微分方程的示例。MATLAB 提供几个非刚性 ODE 求解器。 • ode45 • ode23 • ode78 • ode89 • ode113 对于大多数非刚性问题&#xff0c;ode45 的性能最佳。但对于允许较宽松的误差容限或刚度适中的问题&…

前端vue3+typescript架构

1、vue creat 项目名称 选择自定义 选择需要的依赖 选择vue3 一路enter&#xff0c;选择eslistprettier 继续enter&#xff0c;等待安装 按步骤操作&#xff0c;项目启动成功 2、vscode安装5款插件 2、代码保存自动格式化&#xff0c;保证每个开发人员代码一致&#xff0c;根目…

关于devos勒索病毒,这些是你应该了解的,勒索病毒解密

Devos 勒索病毒是一种近年来引起广泛关注的恶意软件&#xff0c;它通过加密用户文件来实施勒索&#xff0c;给用户带来了极大的困扰。本文将介绍 Devos 勒索病毒的特征、危害、防范措施及案例分析&#xff0c;帮助大家更好地了解和应对这一威胁。 一、Devos 勒索病毒的特点 加密…

C语言——指针进阶(一)

目录 ​编辑 一.字符指针 1.1 基本概念 1.2 面试题 二.指针数组 三.数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 四.数组参数、指针参数 4.1 一维数组传参 ​编辑 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 ​编辑 五.…

ScheduleJS Crack,新的“信息列”水平滚动功能

ScheduleJS Crack,新的“信息列”水平滚动功能 增加了对Angular 16的支持 新的“信息列”水平滚动功能。 新的“信息列”固定功能。 添加了输入属性以处理组件模板中的偶数和奇数ScheduleRowPlainBackgroundColor以及CSS变量。 改进了“信息列”和角度甘特组件的类型。 Schedul…

Linux内核学习(十一)—— 进程地址空间(基于Linux 2.6内核)

目录 一、地址空间 二、内存描述符 三、虚拟内存区域 四、操作内存区域 find_vma() mmap() 和 do_mmap()&#xff1a;创建地址区间 五、页表 一、地址空间 进程地址空间由进程可寻址并且允许进程使用的虚拟内存组成&#xff0c; 每个进程都有一个 32 位或 64 位的平坦&…

HTB Getting Started

HackTheBox Getting Started 练习解析 1.Basic Tools 直接用知识点 sjhdvjshtb[/htb]$ netcat 10.10.10.10 22SSH-2.0-OpenSSH_8.4p1 Debian-32.Service Scanning 这题需要连接vpn进行扫描 kail连接VPN sudo openvpn academy-regular.opvn #kail 没安装openvpn需要进行安装…

文本分类任务

文章目录 引言1. 文本分类-使用场景2. 自定义类别任务3. 贝叶斯算法3.1 预备知识3.2 贝叶斯公式3.3 贝叶斯公式的应用3.4 贝叶斯公式在NLP中的应用3.5 贝叶斯公式-文本分类3.6 代码实现3.7 贝叶斯算法的优缺点 4. 支持向量机4.1 支持向量机-核函数4.2 支持向量机-解决多分类4.3…

设计模式入门:解密优雅的代码构建

从本篇文章开始&#xff0c;我们将开启一个设计模式的系列文章&#xff0c;主要用来介绍常用的设计模式&#xff0c;使用场景和代码案例&#xff0c;对设计模式不熟悉的老铁可以关注一下&#xff0c;可以快速让你入门设计模式。 在软件开发的世界中&#xff0c;设计模式是一种…

1.神经网络基础知识

所有有用的计算机系统都有一个输入和一个输出&#xff0c; 并在输入和输出之间进行某种类型的计算。 神经网络也是如此。 当我们不能精确知道一些事情如何运作时&#xff0c; 我们可以尝试使用模型来估计其运作方式&#xff0c; 在模型中&#xff0c; 包括了我们可以调整的参数…

4-1-netty

非阻塞io 服务端就一个线程&#xff0c;可以处理无数个连接 收到所有的连接都放到集合channelList里面 selector是有事件集合的 对server来说优先关注连接事件 遍历连接事件

list(介绍与实现)

目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modififiers 1.2.6 list的迭代器失效 2. list的模拟实现 2.1 模拟实现list 2.2 list的反向迭代器 1.…

Python 潮流周刊#17:Excel 终于支持 Python 了、Meta 重磅开源新项目、Mojo 新得 1 亿美元融资...

△点击上方“Python猫”关注 &#xff0c;回复“1”领取电子书 你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。标题取自其中三则分享&#xff0c;不代表全部内容都是该主题&#xff0c;特此声明。 本周刊由 Python猫 出品…

内核模块添加功能及使用(静态、动态)

一、向内核添加新功能 1.1 静态加载法&#xff1a; 即新功能源码与内核其它代码一起编译进uImage文件内 新功能源码与Linux内核源码在同一目录结构下 在linux-3.14/driver/char/目录下编写myhello.c&#xff0c;文件内容如下&#xff1a; #include <linux/module.h> #i…