「かわいい」ツイートってなんだろう❓🤔

実は、マーケティングのブログなんです

 このブログ、『IT&マーケティング』などと書きながら実際にはITに関することばかり書いてきました。これは、ずっとマーケティング側の仕事をやってきたために「業務としては苦手分野であるIT実務をスキルアップしたい」という動機でブログをやっているのが理由です。

 とは言え、あまりにもマーケティングから離れっぱなしなのもまずいので、今日は敢えて技術的な内容をほとんど含まないことを書いてみようと思います。

きっかけは『りんな』

 Google Colab Pro(plusでないほう)を契約したので「ぼちぼちNLP(自然言語処理のほう)でも始めるか」ということでネットを検索していたところ、出てきたのが『GPT-2』という言語モデルで構築された文章生成AI『りんな』。なんとColab Proでさくっと動いてしまうではありませんか。

 さっそく自分の愚痴アカウントの10万件のツイートデータを食わせて動かしてみたりしましたが、

かわいくないおっさんが何をつぶやいても面白くない

ことを思い知った(泣)わけです。おっさん、コンテンツにならない。

ツイートデータはなんやかやで手に入るのですが……

 俺のツイートがかわいくないなら、かわいい女子のツイートを食わせればいいじゃないか。そもそも元祖『りんな』は元女子高生AIなのだから、本来、女の子のツイートを大量に学習させてナンボです。

 そこでツイートデータ収集に至るわけですが、ツイートデータそのものはなんやかやで手に入るものです。オトナの事情で具体的な手段には敢えて触れませんが、いま私の手元には2000アカウントくらいの若年層と思しきアカウントのツイートデータが保存されています。

 しかし、この大量のツイートデータ、どれがかわいいのでしょうか❓🤔

『かわいい』の定義や判別はむずかしい

 最初は『かわいい単語』の出現頻度などでツイッターアカウントの「かわいさ」を定量化しようかと思いましたが、すぐに『おじさん構文』のことを思い出して「ダメだ😨」と気づきました。

 ツイートのかわいさは文章全体から醸し出されるものであって、かわいい単語や絵文字を多用するという安直な手段で『かわいい度』をアップすることは出来ず、むしろ「キモいツイート」になってしまうのです。

 どうやら、異なるアプローチが必要なようです。

論文と同じ『アレ』を使えないか?

 そこで思い出したのが、「Googleが初めてウェブページの価値を評価したとき、論文を引用数で評価する手法に習ってページの被リンク数を主な指標にした」という有名な逸話です。かわいいツイートをする女子力が高いアカウントには、きっとたくさんの下心に満ちた@コメントがついているに違いありません。

 とは言え、大量に収集したツイッターアカウントへの@コメントをツイッターからさらに収集するのはさすがに気が引けます。そこで代替案として現在考えているのが、「ツイート数に対する@コメントの出現比率」です。これは「コミュ力が高いアカウントなら、受け取った@コメントに対して一定比率で返信をするだろう」という仮説に基づいています。

 ただし、この方法は「一方的に@コメントを送りまくるネットナンパ男子」のアカウントも一緒に拾ってしまいそうな不安感があります。まだ集計スクリプトを組んではおりませんので、より良い方法があれば是非コメントかツイッターでご教示頂けると嬉しいです。

Googleドライブの鬼仕様な『フォルダダウンロード』を回避する裏技(Piping Server)

 最近、Google Colab Pro(月1,072円)を契約したので、『NVIDIA V100』という高性能GPUで機械学習ごっこ(GPT-2,BERT等)をして遊んでいます。

 ところが、機械学習は10GB単位で鬼のようにデータを吐き出すので、Googleドライブが100GB有料契約(月250円)でもすぐ満杯になってしまいます。

 学習したモデルを即消しすれば良いのですが、様々なデータを食わせてAIの挙動を比べるような楽しいことが出来なくなってしまいます。

 そこで考えるのが学習データのバックアップ=Googleドライブからのダウンロードです。しかし、Googleドライブがまさかの変な挙動を示しましたので、注意喚起しつつ対処方法を記録しておきます。

圧縮すらされず変なファイルが落ちてくる

 Googleではフォルダをダウンロードしようとすると、一つあるいは複数のzipファイルに圧縮して送ってきます。ところが、2.5GBあるような大きなファイルは、なぜか圧縮せずzipとは別にボコボコ送りつけてくるのです😭

Googleドライブは、圧縮しきれなかったファイルだけ非圧縮で送ってくる。最悪だ

 上図のケースでは、各チェックポイントのフォルダごとに複数個作成されるoptimizer.ptというファイルが非圧縮のままボコボコ落ちて来た例です。ファイル名が重複するので『optimizer-002.pt』『optimizer-005.pt』など謎なファイル名になっています。さすがにこれは私も

「どのoptimizer.ptだよ!!」

キレ気味困惑してしまいます。課金してもデレないGoogleドライブの仕様を何とかして回避しなければなりません。

こうなったら自力で圧縮だ

 Googleドライブの圧縮機能がおかしいなら、自力で圧縮するまでです。Colab ProにはUbuntu Linuxのシェルがついてくるので、notebookにシェルコマンドを記述しなくても普通にシェル芸が使えます。そこで、まずはtar.gzでフォルダごと圧縮します。

シェル間ファイル転送の裏技『Piping Server』

 24時間で落ちるシンデレラ型インスタンス()であるColab Proで、ファイル転送だけのためにサーバーを立てたりトンネリングの設定をするのは面倒くさい。そこで思いついた対策がRyo Otaさんの『Piping Server』です。

 Piping Serverは、遠隔地のシェルのWebブラウザ(curl等)を仲介してWebブラウザ同士で直接テキストやファイルを送受信するものです。追加アプリのインストールが全く要らない、すごい……。

【送信側】 『Piping Server』は、任意のWebブラウザ間で直接ファイルを送受信できるサービス
【受信側】 『Piping Server』は、任意のWebブラウザ間で直接ファイルを送受信できるサービス

あとは、回線品質の安定を祈るのみです……(現時点でまだダウンロード中です💦)

ダウンロード中にColabのセッション切れを防ぐ

  2時間ほどダウンロードしたところで、切断されてしまいました。シェルコマンドが動いていてもColabセンセイは容赦なく未使用とみなしてセッションを切ってしまうようです。

 これはColabでは有名な問題で、既に他の方が解決策を見つけられています:

Google Colab セッション切れを防止する

【追記】Colab Serverとの通信速度が上がらない……

 その後、梅雨の合間を縫って図書館に行き、Piping ServerでColabからローカルへのダウンロードを試みました。しかし、通信速度が低く、1GB/時くらいしか出ません。図書館のネットは1時間に一回くらい切断される仕様なので、もはやファイルを分割するしかありません。

/content/drive/MyDrive/work# ls -al
total 8449838
drwx------ 2 root root       4096 Jun 19 04:41 output
drwx------ 2 root root       4096 Jun 19 04:32 output-3epochs
-rw------- 1 root root 8631501037 Jun 26 23:59 output-3epochs.tar.gz
drwx------ 2 root root       4096 Jun 18 15:37 runs
-rw------- 1 root root   21116052 Jun 18 15:34 train.txt
drwx------ 2 root root       4096 Jun 18 15:01 transformers
/content/drive/MyDrive/work# split -b 1000m -a 2 output-3epochs.tar.gz output-3epochs_p_
/content/drive/MyDrive/work# mkdir split
/content/drive/MyDrive/work# mv output-3epochs_p* split/
/content/drive/MyDrive/work# cd split
/content/drive/MyDrive/work/split# ls -al
total 8429201
-rw------- 1 root root 1048576000 Jun 29 09:08 output-3epochs_p_aa
-rw------- 1 root root 1048576000 Jun 29 09:08 output-3epochs_p_ab
-rw------- 1 root root 1048576000 Jun 29 09:08 output-3epochs_p_ac
-rw------- 1 root root 1048576000 Jun 29 09:09 output-3epochs_p_ad
-rw------- 1 root root 1048576000 Jun 29 09:09 output-3epochs_p_ae
-rw------- 1 root root 1048576000 Jun 29 09:09 output-3epochs_p_af
-rw------- 1 root root 1048576000 Jun 29 09:10 output-3epochs_p_ag
-rw------- 1 root root 1048576000 Jun 29 09:10 output-3epochs_p_ah
-rw------- 1 root root  242893037 Jun 29 09:10 output-3epochs_p_ai
/content/drive/MyDrive/work/split# cat output-3epochs_p_aa | curl -T - https://ppng.io/epochs
[ERROR] Connection on '/epochs' has been established already.
/content/drive/MyDrive/work/split# cat output-3epochs_p_aa | curl -T - https://ppng.io/epochs2
[INFO] Waiting for 1 receiver(s)...
[INFO] A receiver was connected.
[INFO] Start sending to 1 receiver(s)!
% curl https://ppng.io/epochs2 > output-3epochs_p_aa.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ab.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ac.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ad.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ae.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_af.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ag.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ah.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ai.tar.gz
% cat $ output-3epochs_p_* > output-3epochs.tar.gz
% tar -zxvf output-3epochs.tar.gz

 ただのデータバックアップなのに、気が遠くなる作業です。お金持ちの方は観念してGoogleドライブに多額の納金をするのが現実的かと思います……。

 Colabはお得で面白いサービスですが、なかなか癖も強いので付き合うのは大変そうです……。

【追記】分割もダメでした……

 図書館で数日に分けて分割ダウンロードをして、ローカルでtar.gzの解凍を試みたところ

(base) masaru@MacBook-Pro-15 output-3epochs % tar -xvf output-3epochs_p_aa.tar.gz 
x output-3epochs/
x output-3epochs/checkpoint-5000/
x output-3epochs/checkpoint-5000/config.json
x output-3epochs/checkpoint-5000/pytorch_model.bin: truncated gzip input
tar: Error exit delayed from previous errors.

結局エラーが出て解凍出来ませんでした……。回線品質が劣悪でtarやPiping Serverにエラー補正がないため、ダウンロード途中でデータが壊れてしまったものと思われます。

 そんなわけで、「高速回線がないと使いこなせない」というのが、現時点での私のGoogle Colab Proへの見解です。

【追記】3分割で再試行し、ようやくダウンロード成功

 緊急事態宣言が出て図書館の人出が若干減ったので、3分割で再試行しました。

(base) masaru@MacBook-Pro-15 output-3epochs % cat output-3epochs_p_* > output-3epochs.tar.gz 
(base) masaru@MacBook-Pro-15 output-3epochs % ls -al
total 33769200
drwxr-xr-x  6 masaru  staff         192  7 29 18:15 .
drwxr-xr-x  4 masaru  staff         128  7 12 19:03 ..
-rw-r--r--  1 masaru  staff  8631501037  7 29 18:16 output-3epochs.tar.gz
-rw-r--r--  1 masaru  staff  3145728000  7 12 19:35 output-3epochs_p_aa.tar.gz
-rw-r--r--  1 masaru  staff  3145728000  7 21 19:47 output-3epochs_p_ab.tar.gz
-rw-r--r--  1 masaru  staff  2340045037  7 29 18:08 output-3epochs_p_ac.tar.gz
(base) masaru@MacBook-Pro-15 output-3epochs % tar -xvf output-3epochs.tar.gz 
x output-3epochs/
x output-3epochs/checkpoint-5000/
x output-3epochs/checkpoint-5000/config.json
x output-3epochs/checkpoint-5000/pytorch_model.bin
x output-3epochs/checkpoint-5000/tokenizer_config.json
x output-3epochs/checkpoint-5000/special_tokens_map.json
x output-3epochs/checkpoint-5000/spiece.model
x output-3epochs/checkpoint-5000/training_args.bin
x output-3epochs/checkpoint-5000/optimizer.pt
x output-3epochs/checkpoint-5000/scheduler.pt
x output-3epochs/checkpoint-5000/trainer_state.json
x output-3epochs/checkpoint-10000/
x output-3epochs/checkpoint-10000/config.json
x output-3epochs/checkpoint-10000/pytorch_model.bin
x output-3epochs/checkpoint-10000/tokenizer_config.json
x output-3epochs/checkpoint-10000/special_tokens_map.json
x output-3epochs/checkpoint-10000/spiece.model
x output-3epochs/checkpoint-10000/training_args.bin
x output-3epochs/checkpoint-10000/optimizer.pt
x output-3epochs/checkpoint-10000/scheduler.pt
x output-3epochs/checkpoint-10000/trainer_state.json
x output-3epochs/config.json
x output-3epochs/pytorch_model.bin
x output-3epochs/tokenizer_config.json
x output-3epochs/special_tokens_map.json
x output-3epochs/spiece.model
x output-3epochs/training_args.bin
x output-3epochs/train_results.json
x output-3epochs/trainer_state.json
x output-3epochs/eval_results.json
x output-3epochs/all_results.json

 ようやく無事、解凍までたどりつきました……。