Qiitaを流し読みしていたら AutoTrainで文章要約 をする記事が面白そうだったので試してみた. さらにAutoTrainで出来上がったモデルをGoogle Cloud Runにデプロイしてサーバレスに機械学習推論をするMLOps的なところまでを実践.

この記事は18禁です, よろしくお願いします.

HuggingFace Transformers

HuggingFaceとTransformersの関係

まずは用語の整理から.

自然言語処理(NLP)界隈で最近ブイブイいわせてるのがHugging Faceというというプラットフォーム. そしてHugging Faceが開発したNLPライブラリが Transformers というライブラリらしい(やっと理解した).

Hugging Faceのサイトを覗くとGitHubをかなり意識して似せているように見えるね. モデルやデータセットのGitHubを目指しているよう. DataSetならばKaggleにも似たようなHubコンセプトでやっているがこちらはモデルもありNLPに特化しているよう.

そしてTransformersというのはTensorflowやPytorchを元につくられているのでPythonで使えるようだ. PythonとのInteropライブラリ経由で他言語から使えるかもしれないが情報が少ないのでやめておいたほうが良さそう.

そして AutoTrain は HuggingFaceの提供するサブサービスでモデルをノーコードで構築することができる. AutoTrainで作成したモデルはHuggingFaceサイトのUIからで管理できる.

Summarizationでエロい文章生成

きっかけとなったQiitaのAutoTrainで文章要約の記事を元に使ってみた. やった内容は元記事のままなので元記事を参照のこと. ここでは感想をツラツラ.

以前 AV女優の顔のデータを元にGANで妖怪を生成 したことがあったため今回もそんなのりでエロい文章を生成することにした. 具体的にはFANZAのアダルト動画の商品説明をエロく要約する.

FANZAのサイトから商品の名称と説明文を取得してCSVに吐き出した. これが今回のデータ. 詳細は今回のテーマの本質でないので割愛するがスクレイピングで取得.

サンプル数だが転移学習をしているならばそこまで多くはなくてもいいと思ったが今回は1000を投入してみた. 500だと学習不足を示すような記号が表示されたので. (<extra_id_0>みたいなやつ. これは日本語のサンプル数が少ないときに現れたというissueをみつけた).

商品説明をdescritionとして商品名をtitleとし, descriptionをsrcデータ, titleをtargerデータにつかう. titleよりもdescriptionのほうが長いので.

実施例はこちら. まあまあな要約となっている.

> デリヘル呼んだら鬼エロド淫乱痴女ビッチのあかりちゃんが登場!!大好物のオジには全身至る所を嗅ぎまくり全身舐めしゃぶり!!ムラついたおち●ぽに喰らいつくような喉奥コキディープスロート!!お眼鏡に適ったお気に入りのオジち●ぽは裏パコ生ハメセックス!!NSでハメまくり連続絶頂生中出し!!

-> 鬼エロド淫乱痴女ビッチの全身舐めしゃぶって中出しSEX

Google Cloud RunでサーバレスにTransformers pipelineを呼び出す

機械学習推論をREST APIで呼び出すには?

モデルのデプロイについて, HuggingFaceではAcceralated APIという独自サービスとAWSのSageMakerをDefaultでサポートしている. しかしAcceralated Interfaceは結局課金されそうだしAWSよりもGCPに注力したいのでGoogle Cloud Runで作成したモデルをtransformers経由で動かすことを検討した.

このテーマについて, HuggingFaceの公式ブログに手順が乗っている. どうもGitHub Issue でGoogle AI Platformを使いたいという要望があがり, その結果Google Cloud Runのブログ記事が作成されたよう.

またこの記事も類似のテーマで参考になる.

Google Cloud Runに大きすぎるモデルをアップロードするので苦戦

Google Cloud RunでのTransformersの動かし方はわかったものの, 問題はモデルのアップロードだった. ここですごく苦戦してしまった.

まずブログで紹介されているよりもpytorchのモデルが大きすぎる. 4.58GBある. 容量削減は知識でなんとかなりそうだが今はこれはPOCでやっているからこの5GBをなんとかしようとした.

まず今持っているPCが 8年前の8GBのノートパソコン だし自宅ネットワークはWimaxの1日3GB制限のなかなのでなかなか厳しい. 昔買った高性能機械学習用PC は生活に困って売却した.


Google Cloud Shellを利用する方法は, Shellに割り当てられている容量が5GBまでの制限のため, HuggingFaceからモデルをダウンロードすると no space left on device とエラーによって失敗. これもオプションで回避可能かもしれないが, pytorchのモデルは5G程度なのにダウンロードするデータは 10GBを落としてこようとする. この正体は .git配下に5GBのデータがあった.


Google Cloud Buildでのビルド途中でHuggingFaceからモデルダウンロードを試みるものの容量不足でエラー. これについてはdiskSizeGbというオプションやmachnineTypeを高性能に設定してもうまく行かなかったので未調査.

正攻法で考えるとCloud Buildで大きな容量を扱うべきでなく. Cloud Storageにキャッシュしていたものをcopyするのが良さそう. 問題はCloud Storageにどうやってデータを送信するか. そのままダウンロードだと10GBなので. gitを削除して容量削減したい.

救世主!Google Colab

そこでなんとかしようとして使ったのがGoogle Colaboratoryだ.

  • メモリ:12GB
  • ディスク:CPU/TPC:最大107GB、GPU:最大68GB

いやいや凄すぎるだろ. GPUまで無料でつかえちゃうのはもはや意味不明. 問題点はシェルが使えなかったり定期実行はできない. しかしColab上でbashを走らせることでやりたいことはできた. つまりHuggingFaceからデータをダウンロードして容量削減してCloud Storageに保存.

あとはこのデータをGoogle Cloud Buildのビルド中にcopyしてコンテナの中に突っ込めば機械学習用のイメージ作成完了!

Google Cloud Runでメモリ枯渇発生!

これであとはGoogle Could Runでコンテナを実行するだけだろと思ったがいざ実行するとメモリ枯渇.

普通に考えればPyTorchのモデルがすでに5GBあるわけで. どんなに DockerがLinuxを極限まで軽量にしたって8GBですらエラーした. 仕方がないのでGoogle Cloud Runのスペックを16GBまて引き上げたら動いた.

{
"summary_text": "川上奈々美痴女覚醒 金玉カラッポになるまでね"
}

オンライン予測もいいがバッチ予測も検討

いやなかなかサーバレスへのチャレンジは大変だったがいちおう動いた. しかし実際のところサーバレスまで必要かと言うと技術的に面白そうだったからだったので, 実際はオンデマンドでリクエストごとにGoogle Cloud Runを動かかすより定期的にまとめてバッチ処理して結果をキャッシュしたほかがいいかもしれない.

さらに無料でやるならわたしがcronになってマニュアルでGoogle Colabをぽちっとなすればいいかな. 技術的にわくわくすることも実際は人力のほうが優れている場合も多く, それでも技術的にこだわりすぎることはよくないと最近思っている.

See Also

オンラインイケメン判定サービス. PyTorchで学習したモデルはGitHubにこのときはおいた. いちおうHerokuは動いているので誰かつかってたりするのかな?自分はイケメンでないのでもうつかってない.

転移学習で犬猫判定.

AV女優の画像をAIに見せて活性化?

古い記事だが文章生成(NLP)は以下も参照