下载方式
方法一:通过镜像的方式下载:https://hf-mirror.com/
方法二:wget https://huggingface.co/bert-base-chinese/resolve/main/pytorch_model.bin
huggingface-cli download --token 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 --resume-download meta-llama/Llama-2-7b-chat-hf --local-dir Llama-2-7b-chat-hf
model = AutoModelForCausalLM.from_pretrained(model_path, low_cpu_mem_usage=True, **kwargs)
AutoModelForCausalLM:这是transformers库中的一个类,用于自动加载给定预训练检查点路径的因果语言模型(Causal Language Model,CLM)。因果语言模型是一种特殊的语言模型,它只考虑左侧的上下文来预测下一个词。这与双向模型(如BERT)不同,双向模型在预测时会考虑左右两侧的上下文。常见的因果语言模型有GPT系列。
from_pretrained(model_path, low_cpu_mem_usage=True, **kwargs):
from_pretrained是一个类方法,用于从预训练的检查点加载模型。
model_path:这是预训练模型的路径或模型的名称。例如,它可以是gpt2(表示要从Hugging Face的model hub下载GPT-2模型)或一个本地文件路径(如./my_pretrained_model/)。
low_cpu_mem_usage=True:这是一个可选参数,当设置为True时,它会尝试在加载模型时优化CPU内存使用。这对于在资源有限的系统上加载大模型特别有用。
**kwargs:这是其他可选的关键字参数,它们会被传递给from_pretrained方法。这些参数可以用来覆盖模型的默认配置或指定其他加载选项。
总之,这段代码的目的是从给定的model_path加载一个预训练的因果语言模型,并尝试优化CPU内存使用。加载后,你可以使用这个模型进行各种任务,如文本生成、下一个词预测等。
from transformers import AutoTokenizer, AutoModelForCausalLM, AutoModel
tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name, use_fast=False)
# 对句子进行分词和编码
sentence = '这是一个句子'
encoded_input = tokenizer(sentence, return_tensors='pt')
# encoded_input {'input_ids': tensor([[49406, 164, 123, 503, 42891, 363, 19759, 478, 19759, 359, 34517, 354, 35751, 494, 49407]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}
在Hugging Face的Transformers库中,tokenizer通常会返回一个字典,其中至少包含input_ids和attention_mask两个键。input_ids是一个整数张量,表示每个单词或子词在词汇表中的索引;attention_mask是一个布尔张量,用于指示哪些位置有实际的单词(对应于input_ids),哪些位置是填充的(用于使输入长度一致)。
这样编码后的encoded_input就可以直接传递给一个预训练的深度学习模型(如BERT、GPT等)进行进一步的处理或训练了。
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
prompt = "GPT2 is a model developed by OpenAI."
input_ids = tokenizer(prompt, return_tensors="pt").input_ids
gen_tokens = model.generate(
input_ids,
do_sample=True,
temperature=0.9,
max_length=100,
)
gen_text = tokenizer.batch_decode(gen_tokens)[0]
model.generate() 是一个常用的函数,用于在给定的输入基础上生成一系列的token(即文本的基本单元)。下面我会逐一解释代码中的各个参数:
input_ids: 这是一个输入参数,通常是一个tensor,包含了用于启动文本生成的初始token的ID。这些ID对应于模型词汇表中的特定单词或符号。
do_sample: 这是一个布尔值,决定了生成文本时是否使用采样。如果 do_sample 设置为 True,则模型会在每一步根据当前的概率分布随机选择一个token,而不是总是选择概率最高的那个。这有助于增加生成文本的多样性和随机性。
temperature: 这是一个浮点数,用于控制采样过程中的“温度”。较高的温度值会使概率分布更加平滑,从而增加生成文本的随机性和创造性;而较低的温度值则会使概率分布更加尖锐,模型更可能选择概率最高的token,导致生成的文本更加确定和可预测。在这个例子中,温度被设置为0.9,这是一个相对适中的值。
max_length: 这是一个整数,指定了生成文本的最大长度(以token数量计)。在这个例子中,生成文本的长度被限制为最多100个token。这有助于防止模型无休止地生成文本,也可能有助于控制计算资源和时间的使用。
- Gathering the data
Using a GitHub dump of about 180 GB containing roughly 20 million Python files calledcodeparrot
。我们将使用流式传输函数对网络数据进行filter。 - Preparing the dataset
首先需要进行tokenizer,我们将上下文大小固定为128个token,而不是分别在GPT-2或GPT-3中使用1024或2048。
from transformers import AutoTokenizer
context_length = 128
tokenizer = AutoTokenizer.from_pretrained("huggingface-course/code-search-net-tokenizer")
outputs = tokenizer(
raw_datasets["train"][:2]["content"],
truncation=True,
max_length=context_length,
return_overflowing_tokens=True,
return_length=True,
)
print(f"Input IDs length: {len(outputs['input_ids'])}")
print(f"Input chunk lengths: {(outputs['length'])}")
print(f"Chunk mapping: {outputs['overflow_to_sample_mapping']}")
Input IDs length: 34
Input chunk lengths: [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 117, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 41]
Chunk mapping: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
Masked Language Modeling (MLM): 这是BERT及其衍生模型所使用的预训练方法。在这种方法中,模型会尝试预测输入文本中被掩盖(masked)的部分单词。例如,给定句子“我喜欢吃苹果”,它可能会被转换为“我[MASK]吃苹果”,然后模型的任务就是预测[MASK]位置的单词。
Causal Language Modeling (CLM): 这是GPT系列模型所使用的预训练方法。在这种方法中,模型会尝试预测给定文本序列中的下一个单词。例如,给定句子“我喜欢吃”,模型的任务就是预测接下来的单词(如“苹果”)。
CLIP API详解
CLIP是一个多模态视觉和语言模型。它可以用于图像-文本相似性和零样本图像分类。CLIP使用类似ViT的转换器来获得视觉特征,并使用因果语言模型来获得文本特征。然后,文本和视觉特征都被投影到具有相同维度的潜在空间中。投影图像和文本特征之间的点积然后被用作类似的分数。
为了将图像feed到Transformer编码器,每个图像被分割成一系列固定大小的non-overlapping patches,然后线性嵌入。添加[CLS]标记以用作整个图像的表示。作者还添加了绝对位置嵌入,并将生成的矢量序列提供给标准的Transformer编码器。CLIPImageProcessor可用于调整(或重新缩放)模型的图像大小和规格化图像。