Open10
HugginFace備忘録
ピン留めされたアイテム
疑問点
- Datasetsの
ClassLabel
は自作するときどのように設定するのか
読んでいる本
機械学習エンジニアのためのTransformers
Datasets
- データセット全体はDatasetDict, trainやtestを指定するとDatasetが返される
- Datasetはlen()が使用可能、スライス指定で対応する辞書(複数指定した場合は属性ごとにリストになっている辞書)が取り出せる
-
ds.column_names
したときは属性名をリストで返す - featuresでどのようなデータ型が使われているか確認
- アイテムの取り出し方はds["text"][:5]みたいにする
-
-
load_dataset({"csv","text","json"}, data_files="", sep="hoge", names=["text", "label"])
ができる
Datasetsのあつかい
set_format("pandas")
などで、trainやvalを選択した後に(["train"][:])head()
できる
def len_ch(row):
return len(row)
df["len_ch"] = df["text"].apply(len_ch)
# 平均文字数
sum(df["len_ch"]) / len(df)
df["len"] = df["text"].str.slit().apply(len)
# 平均単語数
sum(df["len"]) / len(df)
reset_format()
も可能
Datasetにはfeaturesが存在しており、.features["label"].int2str(x:int)
で対象のラベルIDを文字列に変換できる
>>> tokenizer(t, truncation=True, max_length=5)
{'input_ids': [5661, 318, 257, 3112], 'attention_mask': [1, 1, 1, 1]}
>>> tokenizer(t, truncation=True, max_length=5, return_length=True)
{'input_ids': [5661, 318, 257, 3112], 'attention_mask': [1, 1, 1, 1], 'length': [4]}
>>> tokenizer([t, t2], truncation=True, max_length=2, return_overflowing_tokens=True, return_length=True)
{'input_ids': [[5661, 318], [257, 3112], [10919, 611], [986]], 'attention_mask': [[1, 1], [1, 1], [1, 1], [1]], 'length': [2, 2, 2, 1], 'overflow_to_sample_mapping': [0, 0, 1, 1]}
>>> tokenizer([t, t2], truncation=True, max_length=5, return_overflowing_tokens=True, return_length=True)
{'input_ids': [[5661, 318, 257, 3112], [10919, 611, 986]], 'attention_mask': [[1, 1, 1, 1], [1, 1, 1]], 'length': [4, 3], 'overflow_to_sample_mapping': [0, 1]}
openai-community/gpt2のtokenizer
>>> tokenizer
GPT2TokenizerFast(name_or_path='openai-community/gpt2', vocab_size=50257, model_max_length=1024, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'bos_token': '<|endoftext|>', 'eos_token': '<|endoftext|>', 'unk_token': '<|endoftext|>'}, clean_up_tokenization_spaces=True), added_tokens_decoder={
50256: AddedToken("<|endoftext|>", rstrip=False, lstrip=False, single_word=False, normalized=True, special=True),
}
>>> tokenizer.pad_token = tokenizer.eos_token
>>> tokenizer
GPT2TokenizerFast(name_or_path='openai-community/gpt2', vocab_size=50257, model_max_length=1024, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'bos_token': '<|endoftext|>', 'eos_token': '<|endoftext|>', 'unk_token': '<|endoftext|>', 'pad_token': '<|endoftext|>'}, clean_up_tokenization_spaces=True), added_tokens_decoder={
50256: AddedToken("<|endoftext|>", rstrip=False, lstrip=False, single_word=False, normalized=True, special=True),
}
with torch.autocast()
でtrainer.train()
してはいけない
基本的にforward passだけ通すべきなので、第三者のレポジトリにあるAMPの実装例には要注意
自分の場合、訓練損失が急上昇した後に下降し、その後ゆるやかに上昇し続けた(怪奇)
この失敗の原因としては、バックワードパスのどこかで本来fp32で保持するべきところを16にしてしまっている?公式にもそういう用途で使うなとは書いてあるので重要度は低いが挙動は気になる。