HuggingFace 模型使用指南

本文探讨了HuggingFaceChatGLM模型的构成,包括Tokenizer的文本处理、不同类型的Model(如BERT、GPT、BART)及其应用,以及PostProcessing在NLP任务中的作用。还涉及模型配置和标准化技术如LayerNorm和RMSNorm的比较。

HuggingFace 模型共有三个部分组成:Tokennizer、Model 和 Post Processing。

1 Tokenizer

把输入的文本做切分,然后变成向量。Tokenizer包含三个文件:参考Tokenizer的分词使用过程

  • tokenization_chatglm.py:分词器的 .py 文件,用于模型分词器,加载和使用模型的必要部分(只是处理文本,不涉及任何向量操作)。
  • tokenizer.model:包含了训练好的分词模型,用于将输入文本转换为标记序列;二进制使用 pickle 或者其他序列化工具进行存储和读取。
  • tokenizer_config.json:分词模型的配置信息,用于指定分词模型的超参和其他的相关信息,例如分词器的类型、词汇表大小、最大序列长度、特殊标记等。

2 Model

根据输入的变量提取语义信息。对不同的NLP任务,需要选取不同的模型。

  • Encoder 模型:如 Bert,常用于句子分类、命名实体识别(以及更普遍的单词分类)和抽取式问答;
  • Decoder 模型:如GPT,GPT2,常用于文本生成;
  • Sequence2Sequence 模型:如 BART,常用于摘要,翻译和生成式问答。

Model 模型导出时将生成 config.json 和 pytorch_model.bin 参数文件:参考config.json参数详解

  • config.json:包括模型各种参数,如层数、隐藏层大小、注意力头数以及 Transformers API 的调用关系等,用于加载、配置和使用预训练模型。
  • configuration_chatglm.py:针对 ChatGLM 模型配置的 .py 文件。
  • modeling_baichuan.py:源码文件,定义了模型的结构和前向传播过程。
  • pytorch_model.bin:pytorch 模型的权重文件,保存了模型权重的信息。
{
  "_name_or_path": "THUDM/chatglm3-6b-128k",  # 模型的名称或路径
  "model_type": "chatglm",  # 模型类型是 chatglm
  "architectures": [
    "ChatGLMModel"  # 模型所使用的架构
  ],
  "auto_map": {  # 自动映射的模块,包括配置、模型和序列分类
    "AutoConfig": "configuration_chatglm.ChatGLMConfig",
    "AutoModel": "modeling_chatglm.ChatGLMForConditionalGeneration",
    "AutoModelForCausalLM": "modeling_chatglm.ChatGLMForConditionalGeneration",
    "AutoModelForSeq2SeqLM": "modeling_chatglm.ChatGLMForConditionalGeneration",
    "AutoModelForSequenceClassification": "modeling_chatglm.ChatGLMForSequenceClassification"
  },
  "add_bias_linear": false,  # 是否添加偏置线性层
  "add_qkv_bias": true,  # 是否添加查询-键-值的偏置
  "apply_query_key_layer_scaling": true,  # 是否应用查询-键层缩放
  "apply_residual_connection_post_layernorm": false,  # 是否应用残差连接后的层归一化
  "attention_dropout": 0.0,  # 注意力矩阵中的 dropout 概率
  "attention_softmax_in_fp32": true,  # 注意力 softmax 是否在 float32 上计算
  "bias_dropout_fusion": true,  # 是否将偏置 dropout 融合
  "ffn_hidden_size": 13696,  # FeedForward 网络隐藏层大小
  "fp32_residual_connection": false,  # 是否在 float32 上计算残差连接
  "hidden_dropout": 0.0,  # 隐藏层中的 dropout 概率
  "hidden_size": 4096,  # 隐藏层的大小
  "kv_channels": 128,  # 键值通道数
  "layernorm_epsilon": 1e-05,  # layer normalization 中 epsilon 的值
  "rope_ratio": 500,  # ROPE 比例
  "multi_query_attention": true,  # 每个隐藏层中的自注意头的数量
  "multi_query_group_num": 2,  # 多查询组数
  "num_attention_heads": 32,  # 注意力头数量
  "num_layers": 28,  # 模型的隐藏层数量
  "original_rope": true,  # 是否使用原始 ROPE
  "padded_vocab_size": 65024,  # 填充词汇表大小
  "post_layer_norm": true,  # 是否使用层归一化
  "rmsnorm": true,  # 是否使用 RMSNorm
  "seq_length": 131072,  # 序列长度
  "use_cache": true,  # 是否使用缓存
  "torch_dtype": "float16",  # Torch 数据类型
  "transformers_version": "4.27.1",  # Transformers 库的版本号
  "tie_word_embeddings": false,  # 是否将编码器和解码器的词嵌入层绑定
  "eos_token_id": 2,  # 终止标记的 id
  "pad_token_id": 0  # 填充标记的 id
}

预备知识:

  • WarmUp Learning Rate(学习率预热阶段):在优化 Transformer 结构时,除了设置初始学习率和它的衰减策略,往往还需要在训练的初始阶段设置一个非常小(接近0)的学习率,让它经过一定的迭代轮数后逐渐增长到初始的学习率。
  • Post-LN:是指 Transformer 架构中传统的 Add&Norm 代表的 Layer Normalization 的方式,即把 Layer Normalization 加在残差连接之后。性能良好请参考 Norm 为什么用 LayerNorm (LN) 不用 BatchNorm(BN)
  • Pre-LN:是指把 Layer Normalization 加在残差连接之前。训练稳定 

Post-LN 和 Pre-LN 示意图如下所示,参考原文

因此,可以得出的一个结论是如果层数少,Post-Norm 的效果其实要好一些,如果要把层数加大,为了保证模型的训练,Pre-Norm 显然更好一些。参考PostNorm/PreNorm的差别

Q1:当前主流大模型使用的 Normalization 主要有几种? 

  • Layer Normalization:是对特征张量按照某一维度或某几个维度进行 0 均值,1 方差的归一化操作。参考LayerNorm参数详解,计算过程
  • RMS Normalization:均方根层归一化(Root Mean Square Layer Normalization)是对 Layer Normalization 的改进,去掉了减去均值的部分,性能基本一致,但运行时间减少了 7%-64%。参考文章
  • Deep Normalization:是对 Post-LN 和 Pre-LN 的综合改进,成功地将 Transformer 扩展到 1000 层(即 2500 个注意力和前馈网络子层)。参考文章

3 Post Processing

根据模型输出的语义信息,执行具体的 NLP 任务,比如情感分析,文本自动打标签等。

后期处理 Post Processing 通常要根据你选择的模型来确定,一般模型的输出是 logits(可以看作神经网络输出的经过归一化(softmax 或 sigmoid)的概率),其包含我们需要的语义信息,然后 Post Processing 是经过一个激活函数输出我们可以使用的向量,比如 softmax 层做二分类,会输出对应两个标签的概率值,最后转化为我们需要的信息。

  • Logits 可以取任意实数值,正值表示趋向于分类到该类,负值表示趋向于不分类到该类。
  • 与之对应的 Probability 是经过 Softmax 或 Sigmoid 归一化到 (0-1)之间,表示属于该类的概率。参考深度学习的logits是什么?
<think>好的,用户想了解如何使用Hugging Face的模型API,并且需要教程和示例代码。首先,我需要根据提供的引用内容整理出一个清晰的步骤指南。 首先,用户提到的引用[2]、[3]、[4]都涉及Hugging Face Transformers库的使用,包括加载模型、创建API服务等步骤。因此,我应该从环境准备开始,然后逐步介绍模型选择、数据预处理、微调模型、评估和部署API服务这些步骤。 接下来,需要确保每个步骤都有对应的代码示例。例如,引用[2]中提到了加载BERT模型和分词器的代码,这部分可以直接作为示例。同时,引用[4]提到了使用FastAPI部署翻译服务,这可以作为API部署的示例。 还要注意用户提到的系统级指令,比如行内公式使用$...$,独立公式用$$...$$,但当前问题可能不涉及数学表达式,所以可能不需要这部分。但需要保持回答结构清晰,用中文回答,并生成相关问题。 在整理步骤时,需要分点说明:环境准备、模型选择与加载、数据预处理、微调模型、评估、部署API。每个部分需要简短的说明和代码示例,代码部分用反引号包裹,并注明语言。例如,加载模型的Python代码,FastAPI的示例代码。 最后,生成的相关问题需要与Hugging Face API使用相关,比如模型选择、性能优化、中文处理、FastAPI集成等。这些问题应基于提供的引用内容,确保有据可依。 检查是否有遗漏的步骤,比如数据预处理部分,引用[1]提到了数据预处理的小结,可能需要简要说明。但引用[2]、[4]中的示例更具体,所以应重点放在模型加载和API部署上。 确保回答符合用户要求的结构,步骤清晰,代码正确,引用标识正确添加。例如,在提到加载模型时引用[^2],在部署API时引用[^4],适合初学者的说明引用[^3]。 最后,验证所有引用是否正确对应,避免错误引用。例如,引用[1]虽然提到数据准备和预处理,但用户的问题更关注API使用,所以可能不需要深入数据预处理,但可以简要提及。 总结:回答应包括环境安装、模型加载、预处理示例、微调、评估、部署API,每个部分有代码和说明,结尾生成相关问题,并正确引用来源。</think>### 使用Hugging Face模型API的教程与示例代码 以下是基于Hugging Face Transformers库的API调用流程,涵盖模型加载、数据预处理、微调及部署的完整步骤: --- #### 一、环境准备 首先安装必要的库: ```python pip install transformers torch fastapi uvicorn ``` Hugging Face Transformers库提供丰富的预训练模型接口,支持文本分类、翻译等任务。 --- #### 二、模型选择与加载 根据任务选择预训练模型。以中文文本分类为例,使用BERT模型: ```python from transformers import BertForSequenceClassification, BertTokenizer model_name = 'bert-base-chinese' model = BertForSequenceClassification.from_pretrained(model_name) tokenizer = BertTokenizer.from_pretrained(model_name) # 加载中文分词器[^2] ``` --- #### 三、数据预处理 对输入文本进行编码,生成模型可接受的张量格式: ```python text = "这是一个示例句子" inputs = tokenizer( text, padding=True, truncation=True, return_tensors="pt" # 返回PyTorch张量 ) ``` `padding`和`truncation`确保文本长度统一,避免维度错误[^1]。 --- #### 四、模型推理 调用模型进行预测: ```python outputs = model(**inputs) predictions = outputs.logits.argmax(dim=-1) # 获取分类结果 ``` --- #### 五、微调模型(可选) 如果需要适应特定任务,需准备数据集并调整模型: ```python from transformers import Trainer, TrainingArguments training_args = TrainingArguments( output_dir='./results', num_train_epochs=3, per_device_train_batch_size=16 ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset # 需提前构建数据集 ) trainer.train() # 执行微调 ``` --- #### 六、部署API服务 使用FastAPI构建翻译API服务(以英中翻译为例): ```python from fastapi import FastAPI from transformers import pipeline app = FastAPI() translator = pipeline("translation", model="Helsinki-NLP/opus-mt-en-zh") @app.post("/translate/en2zh") def translate_en_to_zh(text: str): result = translator(text) return {"translation": result[0]['translation_text']} ``` 启动服务后可通过HTTP请求调用翻译接口[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑞雪兆我心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值