子育てしながらエンジニアしたい

現在 5 歳 女の子の子育て中エンジニアによる、技術系 + 日常系ブログ。

SIGNATE で COVID-19 チャレンジ開催

日本版 Kaggle ともいえる SIGNATE で、COVID-19 チャレンジが開催されています。

signate.jp

医療関係者でなくても、データサイエンティストでなくても参加できます。
COVID-19 の早期理解、そして今後の対策のために参加してみてはいかがでしょうか。

SIGNATE COVID-19 Challenge

現時点における日本国内のCOVID-19に関する情報は、国や自治体などで配信方針がバラバラであり、テキスト形式やPDF形式、画像形式などの非構造データで配信されているものも多く、一元的・網羅的でマシンリーダブルかつデータ分析可能な状態になっていないのが実情です。また、罹患者数などの統計データだけではなく、罹患者一人一人に関する感染背景や症状など、できるだけ詳細な情報を網羅的に収集し、データ分析が可能な状態で共有することは、今後の感染対策や治療方針の策定に有用であると考えられますが、このようなデータセットは海外でも未だ公開されていません。

そこで、これらの状況を打破するべく「COVID-19チャレンジ」を開催いたします。

COVID-19 に関する情報は、各自治体ごとにそれぞれのフォーマットで配信されています。
データ解析に使うには、これらのフォーマットを統一し、一つのデータセットにまとめる必要があります。
SIGNATE では、Phase 1 として、まずそのデータセットを構築することを目指しています。
データセット構築がある程度できてきたら、Phase 2 としてデータの解析をするようです。

COVID-19 データセットの構築

以下の Google スプレッドシートを人力で更新していきます。

bit.ly

いろいろな自治体のホームページ等から情報を拾って、このシートに入力していくのがタスクです。
なので、まさに誰でもできます。
でもこのデータセットを作るという作業が非常に重要です。
このデータセットの質によって、今後の解析がうまくいくかどうかも大きく影響されます。
なので、たくさんの人に参加してもらって、質を上げていければ良いのではないでしょうか。

またデータを更新したら、フォーラムに「○○を更新した」という報告をします。
以下は私の投稿例です。

f:id:edosha:20200323154343p:plain
SIGNATE COVID-19 報告

私は SIGNATE を使うのは初めてですが、とても意義のある活動だと思います。
ぜひたくさんの人に参加していただきたいです。


その他

ちなみに本家 Kaggle でも開催されていますが、ちょっと毛色が違います。

www.kaggle.com

こちらは、COVID-19 に関する様々な文献のデータセットが与えられています。
その中から、たとえば感染の経路は?とか、治療法は?とか、様々なテーマごとに、最適な文献を抽出するというタスクが与えられています。

他にも、世界の感染者数や死亡者数などを集めたデータセットも公開されています。

www.kaggle.com

こちらも非常に参考になるデータです。
カーネルには多くの方がデータを Visualize されていて、感染が爆発的に広がっていく様子が伝わってきます...

TensorFlow 2.0 GPU Docker で CNN が動かない問題への対処

以前の記事で、TensorFlow GPU Docker を Ubuntu 18.04 に導入しました。

edosha.hatenablog.jp

ここでは、とりあえず TensorFlow のチュートリアル Notebook が動作したので良しとしていたのですが、いざ実際の Notebook を動かそうとしたらエラーで動作しませんでした。
そのエラー内容と対処方法を記載します。

CNN を動かそうとすると cuDNN のエラーが出る

画像認識のタスクでは CNN を用いるのが一般的です。
以下のようなコードを使用していました。

from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, GlobalAveragePooling2D, Dense

alpha = 0.5
input_shape = (224, 224, 3)
batchsize = 16

mobile = MobileNetV2(include_top=False, input_shape=input_shape, alpha=alpha, weights='imagenet')
x = mobile.output
x = GlobalAveragePooling2D()(x)
c = Dense(2, activation='softmax')(x)
model = Model(inputs=mobile.input,outputs=c)
model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=5e-4, decay=0.00005), metrics=['accuracy'])
hist = model.fit(X_train, y_train, batch_size=batchsize, epochs=50, verbose=2)

別の GPU マシンでは問題なく動いていたのですが、TensorFlow 2.0 GPU Docker では Notebook に以下のようなエラーが出ていました。

Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.

コンソールの方には以下のようなエラーが出ていました。

 I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:1006] successful NUMA node read from SysFS had negative value (-1),
 but there must be at least one NUMA node, so returning NUMA node zero
 I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device
:GPU:0 with 7367 MB memory) -> physical GPU (device: 0, name: GeForce RTX 2070 SUPER, pci bus id: 0000:06:00.0, compute capability: 7.5)
 I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
 E tensorflow/stream_executor/cuda/cuda_dnn.cc:329] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR

CUDNN_STATUS_INTERNAL_ERROR とは...???
TensorFlow のチュートリアルはちゃんと動かせていたので、これは CNN を動かすときだけの問題かもしれません。
いろいろ探し回って、ようやく以下の対処方法を見つけました。

原因と対処方法

見つけたのは Reddit の以下のスレッドです。

www.reddit.com

これによるとプリコンパイル済の TensorFlow に問題があるとか...
これって大問題のような気がするんですが対処してくれないんでしょうか...??

対処方法としては、以下のコードを model.fit() の前に追加すれば動作しました。

config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.compat.v1.Session(config=config)
tf.compat.v1.keras.backend.set_session(session)

この情報に辿り着くまでに 2 日ほどかかりました...

Ubuntu 18.04 Docker で動く Jupyter にリモートの Windows から接続する

前回の記事で、Ubuntu 18.04 Docker に TensorFlow Docker を導入し、Docker 上で TensorFlow GPU が動作する環境を構築しました。
また Ubuntu 18.04 のホストから Docker 内の Jupyter サーバーにアクセスすることまでできました。

edosha.hatenablog.jp

これで十分に満足、、と思いきや、もう一つやりたいことがあります。
それはこの Ubuntu 18.04 Docker に、リモートの Windows から接続し、そこで操作をしたいのです。
なぜかというと、Keyhac というキーバインドを変更するツールで、全体的な操作を Emacs 風にできるようにしているのですが、これが Windows / Mac にしか対応していないからです。

sites.google.com

Ubuntu にもキーバインドを変更するツールはあるようなのですが、Emacs 風にするのに時間がかかりそうなので、今回はリモートの Windows からの操作を目指しました。

やり方

SSH ポートフォワーディングという機能を使います。
これは SSHUbuntu に接続し、Ubuntu のあるポートを Windowsマッピングするような機能です。
なので、まずは UbuntuWindows それぞれで SSH を使えるようにする必要があります。

SSH セットアップ

Ubuntu

セキュリティのことを考えたらいろいろやることはありますが、今回は LAN 内で動作させるだけなので、簡単にやりました。
行ったことは以下と同じです。

www.server-world.info

$ sudo apt -y install openssh-server
$ sudo nano /etc/ssh/sshd_config
# 32行目:no に変更してrootログイン一切禁止
PermitRootLogin no
$ sudo systemctl restart ssh

Windows

Windows 10 から、コマンドプロンプトPowerShellSSH コマンドが使えるようになったらしいです。

How to Enable and Use Windows 10’s New Built-in SSH Commandswww.howtogeek.com

参照先のサイトに従って、Windows の設定 -> アプリと機能 -> オプション機能 を開きます。
私の環境では、なぜかすでに Open SSH クライアント機能が追加されていました。

f:id:edosha:20200219091024p:plain
Windows OpenSSH Client

なければ「機能の追加」から追加できるようです。
機能追加後にコマンドプロンプトssh とうつと、以下のように表示されます。

f:id:edosha:20200219091129p:plain
SSH コマンドプロンプト

これで SSH 関連の準備は完了です。
さっそく以下のコマンドで Windows から Ubuntu に接続します。

$ ssh [User ID]@[Ubuntu IP Address]

[Ubuntu] Docker と Jupyter の起動

次に Ubuntu 側で Docker と Jupyter を起動します。
せっかくなので、さきほど接続した SSH クライアントで起動しました。
前回の記事 で使った tensorflow/tensorflow:2.0.0-gpu-py3-jupyter イメージを起動します。

$ docker run -it --gpus all --rm -p 8888:8888 tensorflow/tensorflow:2.0.0-gpu-py3-jupyter

f:id:edosha:20200219091704p:plain
Jupyter token

前回と同様に Jupyter が起動しました。
ここで最後に出てくる token=*** の部分をコピーしておきます。

ちなみに、Jupyter なしのイメージに自分で Jupyter を入れて起動する場合は、以下のように起動すれば良いようです。

$ jupyter notebook --ip 0.0.0.0 --port 8888 --allow-root --no-browser

こうすると同様に token の値が取れます。

[Windows] SSH ポートフォワーディング

次に Windows 側で、もうひとつコマンドプロンプトを起動します。
ここで行うのは SSH ポートフォワーディングです。
以下のようなコマンドを叩きます。

$ ssh -L 8888:localhost:8888 [User ID]@[Ubuntu IP Address]

これで Windowslocalhost:8888 が、Ubuntulocalhost:8888 にマッピングされました。

[Windows] Ubuntu Docker 上の Jupyter にアクセスする

Windows で Web ブラウザを開き、localhost:8888 にアクセスします。
すると以下のような Jupyter の画面が出ます。

f:id:edosha:20200221101658p:plain
Jupyter token 入力画面

ここで Password or token のところに、先程コピーした token=*** の値を入力します。
すると前回の記事と同様の Jupyter 画面が出ました。

f:id:edosha:20200218114341p:plain
Jupyter 画面

これで無事に Windows からリモートの Ubuntu Docker 上で動く Jupyter にアクセスできました。