第一篇:Hugging Face 核心组件介绍及使用
HuggingFace注册和安装
Hugging Face 是一个提供先进自然语言处理(NLP)工具的平台,支持 Transformer 模型的开发和应用。它拥有庞大的模型库和社区资源,能够满足从研究到工业应用的各种需求
注册Hugging Face账户
- 访问https://huggingface.co/,点击右上角“Sign Up”按钮注册
- 注册完成后创建Access Token
安装Hugging Face 库及其库的介绍⭐⭐⭐⭐⭐
pip install transformers datasets tokenizers # transformers库:用于加载、使用、微调预训练模型 # AutoModelForCausalLM: 用于加载因果处理语言模型 # AutoTokenizer: 自动检测需要加载的预训练模型,并加载预训练模型相应的分词器(tokenizer) # pipeline: 帮助快速使用预训练模型进行各种NLP任务的工具 # BertTokenizer: 是BERT模型对应的分词器,主要作用是将文本转换成BERT模型可以理解的token id序列 # BertforSequenceClassification: 是一个基于BERT模型的序列分类器,用于各种文本分类任务(情感分析、文本雷类型识别等) # datasets库:用于加载和处理HuggingFaceHub上的数据集及其本地数据集 # tokenizers库:用于将文本转换成模型可以处理的数字形式(token id序列) # transforms库、datasets库、tokenizers库 通常一起使用完成NLP任务 1.数据准备:使用datasets库加载和处理数据集 2.文本分词:使用tokenizers库将文本数据转换为 token id序列 3.模型加载和使用:使用transformers库加载预训练模型,并将token id序列输入到模型中进行推理和微调
Hugging Face API使用(了解)
匿名访问API
可以通过 Hugging Face Inference API 匿名使用预训练模型(注意:匿名访问的模型受限于公开权限)
import requests API_URL = "https://api-inference.huggingface.co/models/uer/gpt2-chinese-cluecorpussmall" #不使用Token进行匿名访问模型 response = requests.post(API_URL,json={"input":"你好,hugging face"}) print(response.json())
使用Interence API
注册并获取API Token后,可以使用自己的API Token进行访问
import requests #使用Token在线访问模型 API_URL = "https://api-inference.huggingface.co/models/uer/gpt2-chinese-cluecorpussmall" API_TOKEN = "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" # 创建一个字典headers,用于设置HTTP请求头, # Authorization是一个标准头部,用于向服务器验证客户端的身份 # Bearer是一个简单的授权方式,告诉服务器如何解释和验证你提供的token headers = {"Authorization": f"Bearer {API_TOKEN}"} response = requests.post(API_URL,headers=headers,json={"inputs":"你好,Hugging face"}) print(response.json()) # [{'generated_text': '你好,Hugging face络 九 州 风 神 ……'}]
模型库的下载(加载)与使用⭐⭐⭐⭐⭐
将"uer/gpt2-chinese-cluecorpussmall"模型下载到本地缓存
#将模型下载到本地调用 from transformers import AutoModelForCausalLM,AutoTokenizer # AutoModelForCausalLM: 用于加载因果语言模型(Causal Language Model) # 因果语言模型: 根据前面的文本来预测后面的文本(常见的因果语言模型: GPT-2、GPT-3、GPT-Neo) # AutoTokenizer: 自动检测需要加载的预训练模型,并加载预训练模型相应的分词器(tokenizer) # 分词器: 将文本分割成更小单元的工具 # 将模型和分词器下载到本地缓存,并指定保存路径 model_name = "uer/gpt2-chinese-cluecorpussmall" cache_dir = "../model/uer/gpt2-chinese-cluecorpussmall" # 相对路径 # form_pretrained()函数: 用于加速加载(下载)预训练模型及其配套的分词器 #下载模型 AutoModelForCausalLM.from_pretrained(model_name,cache_dir=cache_dir) #下载分词工具 AutoTokenizer.from_pretrained(model_name,cache_dir=cache_dir) print(f"模型分词器已下载到:{cache_dir}")
本地缓存离线调用"GPT2"模型
# 本地缓存离线调用GPT2 from transformers import AutoModelForCausalLM,AutoTokenizer,pipeline # 设置具体包含config.json的目录,本地调用只支持绝对路径 # r作用是告诉Python解释器不要对字符串中的反斜杠(\)进行转义 model_dir = r"D:\PycharmProjects\day01\model\uer\gpt2-chinese-cluecorpussmall\models--uer--gpt2-chinese-cluecorpussmall\snapshots\c2c0249d8a2731f269414cc3b22dff021f8e07a3" #加载模型和分词器 model = AutoModelForCausalLM.from_pretrained(model_dir,trust_remote_code=True,local_files_only=True) # trust_remote_code:允许加载模型时执行远程代码(通常用于加载非官方或社区自定义的模型) # local_files_only:强制从本地加载模型 tokenizer = AutoTokenizer.from_pretrained(model_dir) #使用加载的模型和分词器创建生成文本的pipeline # task任务:文本生成 # model:指定预训练模型 # tokenizer:指定分词器 # device:指定运行模型的设备(GPU(cuda),CPU) generator = pipeline(task="text-generation",model=model,tokenizer=tokenizer,device="cpu") #生成文本 # output = generator(text_inputs="你好,我是一款语言模型,",max_length=50,num_return_sequences=1) output = generator( text_inputs="你好,我是一款语言模型,", # 生成文本的输入种子文本(prompt)。模型会根据这个初始文本,生成后续的文本 max_length=50, # 指定生成文本的最大长度。这里的 50 表示生成的文本最多包含 50 个标记(tokens) num_return_sequences=1, # 参数指定返回多少个独立生成的文本序列。值为 1 表示只生成并返回一段文本。 truncation=True, # 该参数决定是否截断输入文本以适应模型的最大输入长度。如果 True,超出模型最大输入长度的部分将被截断;如果 False,模型可能无法处理过长的输入,可能会报错。 temperature=0.7, # 该参数控制生成文本的随机性。值越低,生成的文本越保守(倾向于选择概率较高的词);值越高,生成的文本越多样(倾向于选择更多不同的词)。0.7 是一个较为常见的设置,既保留了部分随机性,又不至于太混乱。 top_k=50, # 该参数限制模型在每一步生成时仅从概率最高的 k 个词中选择下一个词。这里 top_k=50 表示模型在生成每个词时只考虑概率最高的前 50 个候选词,从而减少生成不太可能的词的概率。 top_p=0.9, # 该参数(又称为核采样)进一步限制模型生成时的词汇选择范围。它会选择一组累积概率达到 p 的词汇,模型只会从这个概率集合中采样。top_p=0.9 意味着模型会在可能性最强的 90% 的词中选择下一个词,进一步增加生成的质量。 clean_up_tokenization_spaces=True # 该参数控制生成的文本中是否清理分词时引入的空格。如果设置为 True,生成的文本会清除多余的空格;如果为 False,则保留原样。默认值即将改变为 False,因为它能更好地保留原始文本的格式。 ) print(output) # [{'generated_text': '你好,我是一款语言模型, 于 2012 年 8 月……'}]
将"bert-base-chinese"模型永久下载到本地并调用
- transformers分为两个部分:
- 编码器BERT(用于分类)
- 解码器GPT(用于生成文本)
from transformers import BertTokenizer,BertForSequenceClassification,pipeline model_dir = r"D:\PycharmProjects\day01\model\bert-base-chine" model_name = "bert-base-chinese" # 加载模型和分词器并永久保存 model = BertForSequenceClassification.from_pretrained(model_name) tokenizer = BertTokenizer.from_pretrained(model_name) model.save_pretrained(model_dir) tokenizer.save_pretrained(model_dir) #创建分类pipleine classifier = pipeline(task="text-classification",model=model,tokenizer=tokenizer,device="cpu") #进行文本分类 result = classifier("你好,我是一款语言模型") print(result) # [{'label': 'LABEL_0', 'score': 0.5823377966880798}] print(model)

[{'label': 'LABEL_1', 'score': 0.7214813828468323}] # label:分类标签、score:该标签的预测概率 BertForSequenceClassification( (bert): BertModel( # bert(bert主干模型):用于提取输入文本的上下文 (embeddings): BertEmbeddings( (word_embeddings): Embedding(21128, 768, padding_idx=0) # 将输入的 token ID 映射为词向量 (position_embeddings): Embedding(512, 768) (token_type_embeddings): Embedding(2, 768) (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True) (dropout): Dropout(p=0.1, inplace=False) # 随机丢弃部分神经元,防止过拟合 ) (encoder): BertEncoder( (layer): ModuleList( (0-11): 12 x BertLayer( (attention): BertAttention( (self): BertSdpaSelfAttention( (query): Linear(in_features=768, out_features=768, bias=True) (key): Linear(in_features=768, out_features=768, bias=True) (value): Linear(in_features=768, out_features=768, bias=True) (dropout): Dropout(p=0.1, inplace=False) ) (output): BertSelfOutput( (dense): Linear(in_features=768, out_features=768, bias=True) (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True) (dropout): Dropout(p=0.1, inplace=False) ) ) (intermediate): BertIntermediate( (dense): Linear(in_features=768, out_features=3072, bias=True) (intermediate_act_fn): GELUActivation() ) (output): BertOutput( (dense): Linear(in_features=3072, out_features=768, bias=True) (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True) (dropout): Dropout(p=0.1, inplace=False) ) ) ) ) (pooler): BertPooler( # 对输出的第一个token的表示进行池化,生成一个768维的句子表示 (dense): Linear(in_features=768, out_features=768, bias=True) (activation): Tanh() ) ) (dropout): Dropout(p=0.1, inplace=False) # 在分类器之前应用dropout,防止过拟合 (classifier): Linear(in_features=768, out_features=2, bias=True) # 分类器:将768维的句子表示映射到2维度 )
datasets库核心方法⭐⭐⭐⭐⭐
加载数据至缓存并调用
# 加载数据至缓存 # 如果没有指定数据库缓存位置,则默认保存在C:\Users\yuanxiaojiang\.cache\huggingface from datasets import load_dataset dataset = load_dataset(path="lansinuote/ChnSentiCorp",cache_dir="./data/") print(dataset) # load_dataset函数的加载方式: # 如果本地缓存中存在数据集并且是最新的,则直接从缓存加载, # 如果本地缓存不存在或不是最新的,则从Hugging Face Hub在线下载数据集保存在本地缓存
加载数据至本地并调用
# 加载数据集到本地 from datasets import load_dataset, load_from_disk dataset = load_dataset("lansinuote/ChnSentiCorp") save_path = r"D:\PycharmProjects\day02\data\chn_senti_corp" dataset.save_to_disk(save_path) # 关键步骤:显式保存 # 加载已保存的数据集(纯本地加载) loaded_dataset = load_from_disk(save_path) # load_from_disk需要指向通过save_to_disk方法保存的目录,而不是自动生成的缓存目录 print(loaded_dataset)
load_dataset()、sava_to_disk()⭐
load_dataset(cache_dir) 自动缓存 | save_to_disk() 显示保存 | |
设计目的 | 自动管理缓存,避免重复下载 | 控制数据集的长期存储 |
目录结构 | 目录复杂,包含哈希值命名的子目录( /data/lansinuote___chn_senti_corp/default/0.0.0/bc4c119/dataset_info.json ) |
目录简单,直接包含数据集元数据和分片文件( data/chn_senti_corp/dataset_dict.json ) |
加载方式 | 隐式:系统自动处理,用户不可控(只能指定缓存根目录,具体子目录由用户生成) | 显示:用户主动控制(明确指定路径,主动控制数据存储位置) |
使用场景 | 临时使用数据集,避免重复下载 | 需要长期保存、分享数据集、控制存储路劲 |
加载方式 | 通过load_dataset自动复用缓存 | 必须通过load_from_disk("your_path")显示加载 |