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

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

パスワード入力を省略して SCP コマンドを実行する

背景

簡易的なバックアップのために、定期的にファイルのコピーを行うことになりました。
ある Linux マシンから別の Linux マシンにファイルコピーを行う環境なので、

  • 定期的な実行 -> cron
  • ファイルコピー -> scp

をそれぞれ使うことにしました。

通常 scp はパスワードの入力が求められます。
そのため cron やシェルスクリプトでそのまま扱いにくいです。
そこで、SSH key を使ってパスワード入力を省略することにしました。

SSH key の生成

scp を実行するマシンを A (ユーザa)、コピー先のマシンを B (ユーザb) とします。
A で以下のコマンドを実行します。

a@A$ ssh-keygen -t rsa

こうすると暗号鍵の保存場所やパスフレーズなどが聞かれます。
パスフレーズは入力しないで Enter します。
すると、~/.ssh/id_rsa (private key) と ~/.ssh/id_rsa.pub (public key) が生成されます。

SSH public key を B に追加

生成した SSH public key を B に追加します。
まず B にユーザ b としてログインし、.ssh ディレクトリを作成します。
すでに .ssh ディレクトリがある場合は飛ばして大丈夫です。

a@A$ ssh b@B mkdir -p .ssh

次に、A の public key を B の authorized_keys に追記します。

a@A$ cat .ssh/id_rsa.pub | ssh b@B 'cat >> .ssh/authorized_keys'

これで準備が整いました。

scp する

scp -i を使うと、パスワード入力を求められずに scp できます。

a@A$ scp -i ~/.ssh/id_rsa ~/file_to_send.txt b@B:/path/to/

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 日ほどかかりました...