Hugging Face 是一家于 2016 年成立的美国公司,专门开发用于构建机器学习应用的工具。该公司的代表产品是其为自然语言处理应用构建的transformers库,以及允许用户共享机器学习模型和数据集的平台。本篇介绍如何使用 Python 使用 Hugging Face 上的模型。

配置环境

使用 Hugging Face 的模型库,必然需要使用其公司开发的 transformers 模型库软件包。Transformers模型库(Transformers Library)是一个Python软件包,其中包含了用于文本、图像和音频任务的Transformer模型的开源实现。它与PyTorch、TensorFlow和JAX深度学习库兼容,并包括了BERT和GPT-2等知名模型的实现。该库最初名为“pytorch-pretrained-bert”,后来更名为“pytorch-transformers”,最终改名为“transformers”。

本篇以 Salesforce/blip2-flan-t5-xl 为例演示。更多模型库请访问 Hugging Face 官网 查看 Models。

1
2
3
4
5
6
7
8
9
# 安装虚拟环境
conda create -n huggingface python=3.9 -y
conda activate huggingface

# 安装 pytorch,或者其他深度学习框架,如果 tensorflow
pip install torch==2.0.0+cu118 torchvision==0.15.1+cu118 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu118

# 安装指定版本的 transformer。使用 GitHub 仓库克隆安装指定的版本,以方便使用最新的模型 blip2
pip install git+https://github.com/huggingface/transformers@v4.33.3

使用

借助 transformers 使用 blip2 模型,可以采用在线或离线的方式加载权重。在线加载会自动从 hugging face 下载模型权重。离线加载需要手动从 hugging face 下载模型权重,然后加载本地的权重文件夹。还有一种是把在线加载的模型权重保存到某个文件夹下,然后离线使用。下面对其进行介绍。

blip2 属于多模态大模型一种,权重比较大,如果 GPU 现存有限,那么可以使用半精度或者 INT8,官网上也提供了实例代码,请自行查看。本篇以半精度为例介绍。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 在使用 blip2 前,请先安装 accelerate
# pip install accelerate

# 设置模型可见 GPU 范围. 注意使用 acceleate 后,默认模型会使用所有 GPU,但是 model.generate 时会报:
# The `language_model` is not in the `hf_device_map` dictionary and you are running your script in a multi-GPU environment. this may lead to unexpected behavior when using `accelerate`. Please pass a `device_map` that contains `language_model` to remove this warning. Please refer to https://github.com/huggingface/blog/blob/main/accelerate-large-models.md for more details on creating a `device_map` for large models.

# RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:1 and cuda:0!
# 可以在导入其他包前,现在模型的 GPU 可见范围来解决
import os

os.environ["CUDA_VISIBLE_DEVICES"] = "1"

# 导入依赖包
import torch
import requests
from PIL import Image
from transformers import Blip2Processor, Blip2ForConditionalGeneration

# 1. 在线下载
# 默认下载路径为:/home/jinzhongxu/.cache/huggingface/hub
processor = Blip2Processor.from_pretrained("Salesforce/blip2-flan-t5-xl")
model = Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-flan-t5-xl", torch_dtype=torch.float16, device_map="auto")

# 2. 离线下载后加载
# 离线下载请访问 https://huggingface.co/Salesforce/blip2-flan-t5-xl,使用下面 git lfs 下载下来配置文件和模型权重
## Make sure you have git-lfs installed (https://git-lfs.com)
# git lfs install
# git clone https://huggingface.co/Salesforce/blip2-flan-t5-xl
# 假设下载到 "/disk1/datasets/models/huggingface/blip2-flan-t5-xl",加载本地模型方法如下:
model_path = '/disk1/datasets/models/huggingface/blip2-flan-t5-xl'
processor = Blip2Processor.from_pretrained(model_path)
model = Blip2ForConditionalGeneration.from_pretrained(model_path, torch_dtype=torch.float16, device_map="auto")

# 3. 在线下载后保存到本地
processor = Blip2Processor.from_pretrained("Salesforce/blip2-flan-t5-xl")
model = Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-flan-t5-xl", torch_dtype=torch.float16, device_map="auto")
model_saved = "/disk1/datasets/models/huggingface/blip2-flan-t5-xl-saved/"
processor.save_pretrained(model_saved)
model.save_pretrained(model_saved)
# 下次运行时,便可以直接加载本地模型
processor = Blip2Processor.from_pretrained(model_saved)
model = Blip2ForConditionalGeneration.from_pretrained(model_saved, torch_dtype=torch.float16, device_map="auto")

# 上面的 1, 2, 3 请选择一种加载模型
# 模型推理
img_url = 'https://storage.googleapis.com/sfr-vision-language-research/BLIP/demo.jpg'
raw_image = Image.open(requests.get(img_url, stream=True).raw).convert('RGB')

question = "how many dogs are in the picture?"
inputs = processor(raw_image, question, return_tensors="pt").to("cuda", torch.float16)

out = model.generate(**inputs, max_length=20)
print(processor.decode(out[0], skip_special_tokens=True))

参考文献

  1. Salesforce/blip2-flan-t5-xl
  2. Save HuggingFace Model to Local - for No Internet