huggingface transformers v4.19.0で加えられたremove_unused_columnsの変更について
ご無沙汰しております。
なかなか多忙の日々を過ごしております。
今日は先日気づいた、huggingface transformers v4.19.0で加えられたremove_unused_columns
の変更に関してちょっと備忘録がてら書こうかと
remove_unused_columnsオプションとは
そもそもこのオプションなんですが、TrainingArgumentsに用意されているオプションで、その名の通りデータセットから不要なカラムを取り除くオプションです。
デフォルトTrueになっています。
現行Stableだとこの辺に記載があります。
文脈を追った限り、もともとはdatasets.Datasetを使ったデータのために用意されたオプションだったようです。
v4.19.0の変更
remove_unused_columns
自体はそのようなものだったので、実はこれまで僕のようにdatasets.Dataset
を使わずに自前で用意していた場合あまり意識することのないオプションでした。
ですがv4.19.0から、この適用範囲を広げる変更が入りました。
このPRによると、それをdatasets.Dataset
だけでなく別途自前で用意したようなデータにも適用したほうが出力が同じになっていいよねみたいな文脈で変更されたようです。
つまるところdatasets.Dataset
ではなく自前で・任意の・野良でデータを用意していても、data_collatorに渡る間にremove_unused_columns
が適用されるように変更されたということです。
これによりなにが起きるかというと、自前で用意したものの場合に、意図しないカラムが削除されてエラーになったり想定と異なる挙動になったりします。
Input In [15], in <listcomp>(.0)
3 def data_collator(features: list) -> dict:
----> 4 x = [f["x"] for f in features]
5 y = [f["y"] for f in features]
6 inputs = tokenizer(x, return_tensors=None, padding='max_length', truncation=True, max_length=64, is_split_into_words=True)
KeyError: 'x'
具体的にはこんな感じで、想定しているkeyがremove_unused_columns
によって消されてエラーになったりします。
対処法
暫定的にはシンプルにTrainingArguments
でremove_unused_columns=False
を指定するのが楽です。
長期的な目線でみると、datasets.Dataset
を使わない場合にもdatasets.Dataset
で想定しているようなフォーマット・カラム名に統一していく方が管理が楽なのかもしれないと思います。
どこまでhuggingfaceの思想に乗っかるかにもよると思いますが。
拙作のNERチュートリアル的ノートブックではとりあえずremove_unused_columns=False
を指定して更新してあります。
(※直近ここでエラーになって困った方々、申し訳ありません)
最後に
以上、transformers v4.19.0で加えられたremove_unused_columnsの変更の話でした。
内容自体はちょっとした変更ですが、datasets.Dataset
使ってない場合意外と影響の大きいものだったので、個人的にはびっくりした次第です笑
少しでも参考になれば幸いです。
Discussion