微调前的准备

Python 中的 LLM 入门

Jasmin Ludolf

Senior Data Science Content Developer, DataCamp

Pipelines 与 Auto 类

Pipelines: pipeline()

  • 简化任务
  • 自动选择模型和分词器
  • 控制较少

Hugging Face Transformers 的 pipelines

Auto 类AutoModel

  • 可定制
  • 需手动调整
  • 支持微调

Hugging Face Transformers 的 AutoModel 类,展示自定义选项

Python 中的 LLM 入门

LLM 生命周期

LLMs 生命周期

预训练

  • 广泛数据
  • 学习通用模式
Python 中的 LLM 入门

LLM 生命周期

LLMs 生命周期

预训练                                                             微调

  • 广泛数据                                                          领域特定
  • 学习通用模式                                       专项任务
Python 中的 LLM 入门

为微调加载数据集

from datasets import load_dataset


train_data = load_dataset("imdb", split="train")
train_data = data.shard(num_shards=4, index=0)
test_data = load_dataset("imdb", split="test")
test_data = data.shard(num_shards=4, index=0)
  • load_dataset(): 从 Hugging Face Hub 加载数据集
    • imdb:影评分类
Python 中的 LLM 入门

Auto 类

from transformers import AutoModel, AutoTokenizer

from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased") tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
Python 中的 LLM 入门

分词(Tokenization)

from transformers import AutoTokenizer, AutoModelForSequenceClassification
from datasets import load_dataset

train_data = load_dataset("imdb", split="train")
train_data = data.shard(num_shards=4, index=0)
test_data = load_dataset("imdb", split="test")
test_data = data.shard(num_shards=4, index=0)

model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")


# 对数据进行分词 tokenized_training_data = tokenizer(train_data["text"], return_tensors="pt", padding=True, truncation=True, max_length=64) tokenized_test_data = tokenizer(test_data["text"], return_tensors="pt", padding=True, truncation=True, max_length=64)
Python 中的 LLM 入门

分词输出

print(tokenized_training_data)
{'input_ids': tensor([[  101,  1045, 12524,  1045,  2572,  8025,  1011,  3756,  
2013,  2026, 2678,  3573,  2138,  1997,  2035,  1996,  6704,  2008,  5129,  2009, 
2043,  2009, 2001,  2034,  2207,  1999,  3476,  1012,  1045,  2036, ...
Python 中的 LLM 入门

按行分词

def tokenize_function(text_data):
    return tokenizer(text_data["text"], return_tensors="pt", padding=True, truncation=True, max_length=64)

# 批量分词
tokenized_in_batches = train_data.map(tokenize_function, batched=True)

# 按行分词 tokenized_by_row = train_data.map(tokenize_function, batched=False)
Dataset({
    features: ['text', 'label', 'input_ids', 'token_type_ids', 'attention_mask'],
    num_rows: 1563
})
Python 中的 LLM 入门

子词分词

  • 现代分词器常见
  • 将词拆为有意义的子片段

 

Unbelievably

Python 中的 LLM 入门

子词分词

  • 现代分词器常见
  • 将词拆为有意义的子片段

 

"Unbelievably" 被分为 un、believ、ably。

Python 中的 LLM 入门

让我们来练习!

Python 中的 LLM 入门

Preparing Video For Download...