第一篇: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")显示加载
posted @ 2025-03-07 18:34  猿小姜  阅读(196)  评论(0)    收藏  举报