🤗

huggingface transformers v4.19.0で加えられたremove_unused_columnsの変更について

2022/06/19に公開

ご無沙汰しております。
なかなか多忙の日々を過ごしております。

今日は先日気づいた、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によって消されてエラーになったりします。

対処法

暫定的にはシンプルにTrainingArgumentsremove_unused_columns=Falseを指定するのが楽です。
長期的な目線でみると、datasets.Datasetを使わない場合にもdatasets.Datasetで想定しているようなフォーマット・カラム名に統一していく方が管理が楽なのかもしれないと思います。
どこまでhuggingfaceの思想に乗っかるかにもよると思いますが。

拙作のNERチュートリアル的ノートブックではとりあえずremove_unused_columns=Falseを指定して更新してあります。
(※直近ここでエラーになって困った方々、申し訳ありません)

最後に

以上、transformers v4.19.0で加えられたremove_unused_columnsの変更の話でした。
内容自体はちょっとした変更ですが、datasets.Dataset使ってない場合意外と影響の大きいものだったので、個人的にはびっくりした次第です笑

少しでも参考になれば幸いです。

Discussion