Open10

HugginFace備忘録

ピン留めされたアイテム
fumiyauchiyamafumiyauchiyama

疑問点

  • DatasetsのClassLabelは自作するときどのように設定するのか
fumiyauchiyamafumiyauchiyama

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"])ができる
fumiyauchiyamafumiyauchiyama

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()も可能

fumiyauchiyamafumiyauchiyama

Datasetにはfeaturesが存在しており、.features["label"].int2str(x:int)で対象のラベルIDを文字列に変換できる

fumiyauchiyamafumiyauchiyama
>>> 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]}
fumiyauchiyamafumiyauchiyama

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),
}
fumiyauchiyamafumiyauchiyama
>>> 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),
}
fumiyauchiyamafumiyauchiyama

with torch.autocast()trainer.train()してはいけない
https://pytorch.org/docs/stable/amp.html#torch.autocast
基本的にforward passだけ通すべきなので、第三者のレポジトリにあるAMPの実装例には要注意
自分の場合、訓練損失が急上昇した後に下降し、その後ゆるやかに上昇し続けた(怪奇)

fumiyauchiyamafumiyauchiyama

この失敗の原因としては、バックワードパスのどこかで本来fp32で保持するべきところを16にしてしまっている?公式にもそういう用途で使うなとは書いてあるので重要度は低いが挙動は気になる。