俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

ProbSpaceのRe:不動産取引価格予測コンペの振り返り(3位入賞!)

データ分析プラットフォームProbspaceRe:不動産取引価格予測コンペに参加し、3位に入賞しました!

PublicLBでは、1位だっただけに、非常に悔しい結果でしたが、初めてチームを組ませていただいて、順位としてもこれまでの最高順位となることができ、とても学びの多い有意義なコンペでした。

f:id:kanriyou_h004:20200811104318p:plain

今回のコンペは、一時度開催された不動産取引価格予測コンペの評価指標を変更したコンペという一風変わったコンペでした。

前回は、思ったように成果が残せなかったので、爪痕は残せたかなと思っています。

では、振り返ってまいりたいと思います。 

1.全体構成(俺人パート)

今回は、arenzero(masay)さんとチームで参加させていただいたので、私が担当した部分を振り返ります。

全体像としては、以下のとおり2段のスタッキングのモデルでの予測が最高精度になりました。

最終的には、この出力を、arenzeroさんの最高精度の出力と平均して提出していただいたもので、3位に入賞することができました。

一番力を入れたのが、前処理で、trainデータと、政府公示資料の地名や、駅名の表現のゆらぎなどを、うまく繋げられるように、カテゴリ変数化に注力しました。

f:id:kanriyou_h004:20200811110629p:plain

2.前処理

前処理については、前回のコンペ時に使った前処理をベース(ベースの構成)にして、更に精査しました。

具体的には、以下のようにTrainデータと、政府公示資料を見比べて、どのようにつなぎ合わせるかを検討しました。(特にカテゴリ変数)

データ間で、用語が異なっていて苦労しましたが、実際の現場では、よくある話なので、良い経験になりました。

【カテゴリ変数】

trainのカラム 変換内容
「種類」
「用途」
組み合わせることで、政府公示資料の「利用の現状」と繋げられるようにしました。(政府公示資料の「用途」はTrainデータの「用途」とは別物でした)
「地域」 政府公示資料の「用途」に紐付けられるように変換しました。
「市区町村コード」:政府公示資料の「所在地コード」に紐づけました。
「市区町村名」
「最寄り駅:名称」
政府公示資料の「市区町村名」、「駅名」と紐付けられるようにコード化しました。このとき、名前にゆらぎがあったので、駅名等が異なっても同じ駅であれば、同じコードになるように工夫しました。
「間取り」 前回のコンペでの変換ツールを流用して、各部屋種別のOne-hotベクトルと、部屋数に変換しました。
「土地の形状」 政府公示資料の「形状区分」と紐付けられるように「ほぼ」などの曖昧な表現をなくして、コード化しました。
「建物の構造」 政府公示資料の「建物構造」に紐付けられるようにコード変換を実施しました。
「前面道路:種類」
「前面道路:方位」
それぞれ、政府公示資料の「前面道路の方位区分」、「前面道路区分」と紐付けられるようにコード変換しました。
「都市計画」 政府公示資料の「用途区分」と紐付けられるようにコード変換しました。
残りのカテゴリ変数 政府公示資料と紐付けずに、Trainデータ内でTarget encodingを実施しました。

【数値変数】

以下の処理と、文字列を数値に変換。

trainのカラム 変換内容
「建築年」 全部西暦に直して、nanは−1に。
「取引時点」 年を数値にするとともに、四半期分を「0」「0.25」「0.5」「0.75」に変換。
「最寄り駅:距離(分)」 文字列で時間の表記になっている箇所を全て分に変換(例:「1H30?2H」→「105」)。また、政府公示資料では、時間ではなく「駅距離」だったので、徒歩の速度80m/分で割って、「距離(分)」を計算。
「間口」 "以上"、"未満"などの文字列の処理を実施。あわせて、政府公示資料では、「間口」自体の記載はなく、間口と奥行きの比率で記載されていたため、「面積」と「間口(比率)」、「奥行き(比率)」から、算出。
「面積」
「延べ床面積」
「建ぺい率」
容積率
"以上"、"未満"などの文字列の処理を実施。

【追加した変数】

  •  政府公示資料と紐づけを実施した変数について、政府公示資料での各変数毎にグルーピングして平均した価格を追加。
  • 「最寄り駅:名称」、「市区町村コード」、「市区町村名」毎にグルーピングして平均した価格と「面積」を掛けた値を追加。
  • 同じく「最寄り駅:名称」、「市区町村コード」、「市区町村名」毎にグルーピングして平均した価格と(「面積」+「延べ床面積」)を掛けた値を追加。
  • 「取引時点」から「建築年」を引いた「築年数」を追加。

3.モデル構築

 今回は、モデル構築には、それほど時間がかけられず、1段目は、LightGBMとXGboostのハイパーパラメータをOptunaで探索して、CVがよくなるモデルを採用しました。

KFoldでFold数を11のモデルとしています。

また、チーム参加後、気合をいれてスタッキングにも挑戦しました、しかも、2段目は、NNを採用しました。

計算に時間がかかるので、あまりパターンが試せませんでしたが、なんとか7層のNNで最高精度がだせるモデルを作ることができました。

チームに参加していなければ、このモデルを試すこともなかったと思うので、チームを組んでくださって本当に感謝です。

4.チームでの参加について

今回、初めてチームで参加させていただいたのですが、最後の最後まで、とても有意義で、エキサイティングな経験をさせていただきました。

特に、締切間際の数分で、提出回数が復活して、提出した最後のSubmissionが、過去最高LBスコアを叩き出して、PublicLB1位をキープできたときは、しびれました。

残念ながら、PrivateLBでは3位となってしまいましたが、いろいろな意見が交換できたり、自分一人なら実施していなかったであろう取り組みができたり、本当によい経験でした。

5.謝辞

コンペを運営してくださいました、ProbSpaceの運営の皆様、コンペに参加してくださった皆様に心より感謝申し上げます。

チーム参加のお声がけをくださいました、arenzero(masay)さんのおかげで、単独で参加するコンペよりも何倍も素敵なコンペにすることができました。この場を借りて、厚く御礼を申し上げます。

またの機会がございましたら、もっと貢献できるよう更に腕を磨いていきたいと思います。

 

【過去記事】

これまでの道のりは以下の記事をご参照ください。

oregin-ai.hatenablog.com

Docker学習記録のまとめ(米国AI開発者がゼロから教えるDocker講座)

アメリカでデータサイエンティストを実施されているかめ@usdatascientistさんの「米国AI開発者がゼロから教えるDocker講座」をUdemyで受講した学習記録のまとめです。

私は、Dockerという言葉自体を最近知ったぐらいの知識レベルだったのですが、この講座は、ひとつひとつ丁寧に解説いただけますし、ハンズオン形式で講座が進むので、まさに「手で覚える」ことができました。

では、振り返っていきたいと思います。

事前準備編(講座受講前の準備・申込み)

事前の準備として、Dockerをインストール手順と、受講を決心した理由などの記事です。

基礎編

基礎編として、Dockerについて、順に手を動かしながら学んでいきました。

講座だけでなく、kaggleやProbspace、SIGNAGEなど、複数のコンペティションに並行して参加しながら取り組んでいたので、コンペごとに環境を作成して、覚えたことをすぐに実践につなげることができました。

応用編(受講中:完了次第掲載予定)

基礎編で学んだことを使って、実際の利用シーンを想定した環境を構築していきます。

【ただいま受講中、受講次第掲載いたします。】

 

 

f:id:kanriyou_h004:20200808084943p:plain

Dockerのホストとコンテナの関係を理解する(米国AI開発者がゼロから教えるDocker講座)

これまでは、コンテナを起動する際にホストからファイルをコピーしたり、設定等をおこなったりしていましたが、コンテナを起動してからもファイルのやり取りをしたり、コンテナが利用するリソースを制御したりする方法を理解しました。

今回もかめ@usdatascientistさんの「米国AI開発者がゼロから教えるDocker講座」をUdemyで受講しながら進めています。

とても分かりやすく解説いただけますし、ハンズオン形式で講座が進むので、まさに「手で覚える」ことができるので、おすすめです!

www.udemy.com

では、振り返っていきたいと思います。

Dockerのホストとコンテナの関係を理解する

1.ホストとコンテナ間でファイルを共有する(-v オプション)

これまで、ホストからコンテナにファイルを渡すときは、Docker image作成時にファイルをコピーしていました、しかしながら、コンテナ起動後、ファイルをやりとりしたくなることもあります。また、コンテナに大きなファイルをおきたくないこともあります。

このようなときには、「-v」オプションを使うことで、ホストのファイルシステムをコンテナにマウントすることができます。

では、早速やってみます。

今回は、ホスト側に「mounted_folder」を作成しマウントされたことの確認用に、この中に「file_at_host」というファイルを作っておきます。

そして、このディレクトリを、コンテナ側に「new_dir」を作成した「new_dir」というディレクトリにマウントさせます。

まずは、以下のDockerfileを作成します。

FROM ubuntu:latest
RUN mkdir new_dir

作成したDockerfileが保存されたディレクトリに移動して、Dockerをbuildします。

docker build .

f:id:kanriyou_h004:20200725154105p:plain

図1.docker buildの実行

作成されたDocker imageから、コンテナを立ち上げます。

立ち上げる時に「-v」オプションを指定します。引数には、ホスト側のマウントするホスト側のディレクトリと、コンテナ側のディレクトリを「:」で区切って記載します。

docker run -it -v ~/tmp/docker/mounted_folder:/new_dir 616979cf0014

f:id:kanriyou_h004:20200725155702p:plain

図2.ホスト側のディレクトリをマウントしてコンテナを立ち上げる

コンテナが起動したら、「new_dir」が作成され、「mounted_folder」にマウントされている(「file_at_host」が中にある)ことを確認します。

cd /new_dir

ls

f:id:kanriyou_h004:20200725155840p:plain

図3.「mounted_folder」内のファイルが表示されることを確認する

無事、「new_dir」に「mounted_folder」がマウントされ、ホスト側の「mounted_folder」内に作成した「file_at_host」が表示されることが確認できました。

2.ホストとコンテナ間でアクセス権限を共有する(-u オプション)

 先ほどの「-v」オプションを使ってマウントした場合は、コンテナからホストにアクセスするときに、ルート権限を持ってアクセスできてしまいます。

このため、「-u」オプションを指定することで、適切なアクセス権でマウントさせることができます。

まず、以下のDockerfileを作成します。

FROM ubuntu:latest
RUN mkdir created_in_Dockerfile

作成したDockerfileが保存されたディレクトリに移動して、Dockerをbuildします。

docker build .

f:id:kanriyou_h004:20200725163145p:plain

図5.docker buildを実行する

次にコンテナを立ち上げる際にアクセス権を指定してみます。

「-u」オプションでは、引数にユーザーID,グループIDを「:」で区切って記載します。

この時、各IDの数字を入力するのではなく、コマンドの実行結果を渡すために$(コマンド)の記載を使って、実行結果を直接、引数として渡します。

docker run -it -u $(id -u):$(id -g) -v ~/docker/mounted_folder:/created_in_run 0f9142f9b4ad bash

f:id:kanriyou_h004:20200725164433p:plain

図6.アクセス権を指定してマウントする

マウントされたディレクトリのアクセス権を確認します。

ls -la

f:id:kanriyou_h004:20200725170307p:plain

図7.アクセス権を確認する

Dockerfileで作成した「created_in_Dockerfile」ディレクトリは、ユーザもグループも「root」権限になっています。

コンテナ起動時にアクセス権限を指定した「created_in_run」ディレクトリは、ユーザは「1000」、グループは「staff」となっていることが確認できました。

3.ホストのポートをコンテナのポートにつなげる(-p オプション)

 コンテナ上にWebサービスを立ち上げた際に、IPアドレスはホストのアドレスと同じとなるため、コンテナ上のサービスにアクセスするために、「-p」オプションを指定することで、ホストのポートとコンテナのポートにつなげることができ舞う。

今回は、jupyter notebookのDocker imageをpull(run)して、ポート番号8888同士をつなげます。

docker run -it -p 8888:8888 --rm jupyter/datascience-notebook bash

f:id:kanriyou_h004:20200725175113p:plain

<中略>

f:id:kanriyou_h004:20200725181432p:plain

図8.つなげるポートを指定してコンテナを起動

コンテナが起動できたら、jupyter notebook を立ち上げます。

jupyter notebook

f:id:kanriyou_h004:20200725181730p:plain

図9.jupyter notebookを立ち上げる

コンテナ上でjupyter notebookが立ち上がったら、ホストのブラウザから「http://localhost:8888/」にアクセスします。

f:id:kanriyou_h004:20200725182728p:plain

図10.コンテナ上のjupyter notebookにホストからアクセスする

無事、ホストからコンテナ上のjupyter notebookにアクセスすることができました。

4.コンテナの利用できるリソースを制限する(--cpus,--memory オプション)

 コンテナがホストのリソースを使い切ってしまわないように、それぞれのコンテナに利用できるリソースを制限できます。

CPUについては「--cpus」オプションで引数に利用するコア数を指定します。メモリについては「--memory」オプションで、メモリのバイト数を指定します。

例えば、以下は、CPUを1コア、メモリを2GBに制限したコンテナを立ち上げます。

docker run -it --rm --cpus 1 --memory 2g ubuntu bash

f:id:kanriyou_h004:20200725183848p:plain

図11.リソースを制限してコンテナを立ち上げる

ホストのターミナルから、コンテナのCPU、メモリの利用状況を確認します。

まずは、CPUを確認します。docker inspect コマンドで、コンテナの情報を得ることができます。ただ、情報がたくさん出すぎてしまうので、grepコマンドで、cpuという文字列を含む行だけ出力します。

docker inspect b80dcb84513d | grep -i cpu

f:id:kanriyou_h004:20200725184447p:plain

図12.コンテナで利用できるCPUの利用量を確認する

少し読みづらいのですが「NanoCpus」を確認すると1000000000NanoCPUであることが確認できます。これは、単位がNanoなので、1CPUということになります。

 

同様にメモリについても確認します。

docker inspect b80dcb84513d | grep -i memory

f:id:kanriyou_h004:20200725185047p:plain

図13.コンテナで利用できるメモリの利用量を確認する

またもや、少し読みづらいのですが「Memory」を確認すると2147483648バイトであることが確認できます。これは、1024バイトで1Kバイト、1024Kバイトで1Mバイト、1024Mバイトで1Gバイトなので、計算すると2Gバイトになります。

これで、無事、リソースを制限することができました。

 

今回の振り返りは以上になります。

今回、Dockerのホストとコンテナの関係を理解し、ディレクトリのマウントや、アクセス権限の管理、ポートの接続、リソースの制限ができるようになりました。

これで、Docker講座の基礎編が終わり、一通りDockerが使えるようになりました。

 

今回受講している「米国AI開発者がゼロから教えるDocker講座」では、もっと詳しくわかりやすくご説明いただけているので、ほんとうに良い勉強になります。

次回からは、応用編に進み、Dockerを使いこなせるようになりたいと思います! 

www.udemy.com

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

 

f:id:kanriyou_h004:20200725150502p:plain

機械学習初心者がコンペサイトProbSpaceで金銀銅を獲得し総合4位に到達するまでの道のり

機械学習について全くの専門外で初心者だった私が先日コンペサイトProbspaceのYouTube動画視聴回数予測コンペで9位入賞し、累計で金銀銅を獲得することができ、総合で4位に到達することができました。

f:id:kanriyou_h004:20200723175611p:plain

これまでたどってきた道のりを振り返って、良かった点、悪かった点を見直して、今後の進め方を考えていきたいと思います。

悪戦苦闘、一進一退しながら勧めてきた内容を、思いつくまま記載しているので、お見苦しい箇所もありますが、これから機械学習を始める皆さんや、始めたばかりの皆さんの何らかのキッカケになれれば光栄です。

では、振り返ってまいりたいと思います。

1.G検定との出会い(2019年2月〜3月)

私の人生を変えたといっても過言ではない出来事が、G検定という資格との出会いでした。

この資格は、まだ新しい資格で、実際に受験された方々の中でも様々な評価があるところなのですが、私にとってこの資格を取得するまでの過程があって、今の私があるのは間違いないです。

 

この資格を受験する前は、ただぼんやりと人工知能を利用して何かがやりたい、社会に貢献できることがしたいと考えていただけでした。

このままでは、何も前に進まないと思い、とりあえず「人工知能」「勉強」「資格」「AI」などなど、いろいろキーワードを入れて片っ端から検索してみました。

その結果、以下のサイトにたどり着き、どうやら「G検定」(JDLA Deep Learning for GENERAL)という資格があることがわかりました。

資格試験について - 一般社団法人日本ディープラーニング協会【公式】

 

この資格に取り組むことで、人工知能とはなにか、何が解決できて何が課題なのか、どのような経緯をたどってきているのか、どこに向かっているのかなど、いろいろな背景や現在の状況を知ることができました。

 

また、勉強すううちに「機械学習」というものがあることを知り、「もっと深く勉強したい!」と強く意識付けされるキッカケとなったのが、この試験でした。

 

そして、無事、G検定に合格できたことも、まだまだ自分もやれるんだという大きな自信につながりました。

実際に受験してみた感想や、勉強内容については、過去の記事にまとめていますので、興味がございましたら、そちらもご参照ください。

g-kentei.hatenablog.com

2.Pythonの勉強を始める(2019年4月)

G検定に合格して、すぐにその上位資格のE資格を受験したいと思ったのですが、受験するためには、JDLA認定プログラムを修了している必要があり、実習としてPythonというプログラミング言語を使って、実際に機械学習モデルを自ら構築できる必要がありました。

Python」の読み方すら知らなかった私は、以下の2冊の本を急いで購入し、1から勉強をはじめました。

入門Python 3 [ ビル・ルバノビック ]

ゼロから作るDeep Learning Pythonで学ぶディープラーニングの理論と実装 [ 斎藤 康毅 ]

f:id:kanriyou_h004:20190831215305j:plain

 

特に、ゼロから作るDeep Learning Pythonで学ぶディープラーニングの理論と実装 [ 斎藤 康毅 ]は、名著で、現在も、続編の自然言語処理編、フレームワーク編とともに愛読しています。

ゼロから作るDeep Learning 2 自然言語処理編 [ 斎藤 康毅 ]

ゼロから作るDeep Learning 3 フレームワーク編 [ 斎藤康毅 ]

f:id:kanriyou_h004:20190713165650j:plainf:id:kanriyou_h004:20200723205241j:image

 

Pythonについては、最初、Anacondaのインストールに四苦八苦して、環境構築に悪戦苦闘していましたが、講座が始まる頃には、以下のようなことができるようになっていました。

これまで、本格的にプログラミングをやったことがなかったのですが、プログラミングは、プログラムしたとおりに必ず動いてくれて、自分の思い通りに動く喜びをしることができました。(もちろん、プログラムしたとおりに忠実に動くので、少しのミスがあると、全く動かなかったりすることもあるのですが・・・。)

3.kaggleのデータセットを使って機械学習に挑戦する(2019年4月〜5月)

知り合いからKaggleというものの存在を教えてもらい、データ分析のコンペティションなどが行われていることを知りました。

実際にコンペに参加するのは、まだまだ厳しかったのですが、kaggleのデータセットを使って、自己流も混ざっていますが、機械学習について、本格的に勉強をはじめました。

なかなか精度が向上しなかったり、精度が向上したかと思えばリークしてしまったり、一進一退を繰り返していました。

しかしながら、今思うと、このときに、データを分析したり、前処理を行ったり、モデルのハイパーパラメータを調整したり、結果を評価したりすることで、全体の流れを実際に手を動かして取り組んでいたことが、非常に役に立っていると思います。

具体的には、以下のようなことに取り組みました。

4.E資格を受験する(2019年5月〜8月)

 Python機械学習を事前に学習した状態で、E資格の認定講座を受講いたしました。

まっさらな気持ちで受講されている方々もいらっしゃいましたが、私は受講してすぐ理解できるタイプではないので、事前に十分な予習をしてから受講できたのは、非常に良かったと思いました。

 

認定講座では、理論と平行して実装も行っていくので、知識だけでなく、技術を感覚的に身につけられていると感じました。

また、今、いろいろなコンペに参加する際に何も考えずライブラリを使っている各種学習モデルについても、中身を理解して、1から手組で作る経験が得られたことは、パラメータの調整等の意味がわかって調整できるので、非常に有意義でした。

 

その効果もあって、E資格(JDLA Deep Learning for ENGINEER 2019 #2)に合格することができました。

詳細は、以下の過去記事もご参照ください。

oregin-ai.hatenablog.com

5.Probspaceで給与推定コンペで47位入賞(銅賞)(2019年11月〜12月)

E資格取得後、1〜2ヶ月ほど、復習をしながら、準備を整えて、満を持してProbspaceというデータ分析プラットフォームで開催されていた給与推定コンペに参戦しました。

結果としては、310チーム中 47位 ということで、上位15%に入り、銅賞をいただくことができました。

 

テーブルコンペだったので、取り組みやすく、チュートリアルもわかりやすかったので、初めてのコンペながら楽しんで参戦することができました。

実際に他の皆さんと切磋琢磨しながら取り組むのは、自分一人で学習を進めるのに比べて、何倍も進歩が違うと感じました。

一方で、これまでの積み上げがあったからこそ、なんとかついていけたのだとも思いました。

 

今のところ、自分自信の理解を深める積み上げの期間と、積み上げた結果を確認するアウトプットの期間を織り交ぜていくのが自分の中ではベストです。

コンペに参加しながら、いろいろな最新情報のインプットもできる人には、本当に感服いたします。

 

給与推定コンペの振り返りは、以下もご参照ください。

oregin-ai.hatenablog.com

6.Probspaceで浮世絵作者予測コンペで10位入賞(銀賞)(2019年10月〜2020年1月)

先程の、給与推定コンペと並行して、浮世絵の作者を予測するコンペにも参戦いたしました。

こちらは、約4ヶ月の長丁場でしたが、E資格時に画像分類はさんざん実施してきていたので、知識をフル動員して頑張りました。

結果は、232チーム中 10位に入賞することができ、銀賞をいただきました。

ここまで来ると、だんだん欲がでてきて、どんどんコンペに参加したくなってきていました。

しかしながら、今回のコンペでは、E資格で学習した内容でそこそこの成績までは到達できたものの、10位まで到達するまでには、いろんなパターンを組み合わせて、いろいろ試した結果、スコアが向上したという行きあたりばったりの改善策もありました。

このため、なぜそうなるのかということも理解したい気持がわいてきました。

コンペでの取組内容は、以下をご参照ください。

oregin-ai.hatenablog.com

7.東京大学GCI Winter 2019を受講(2019年12月〜2020年3月)

浮世絵作者予測コンペを取り組む中で、もっと理解を深めたい欲求がでてきたときに、ちょうど東京大学のGCI寄附講座という無料講座を見つけ、早速申し込み、運良く参加することができました。 gci.t.u-tokyo.ac.jp

 こちらは、オンラインの講座だったのですが、単なる講義だけでなく、毎回宿題もあり、コンペもあり、コンペも開催される、かなりハードな4ヶ月間を過ごすことになりました。

しかし、その甲斐あって、確率統計などの基礎知識から、モデルの検証方法や、チューニング方法にいたるまで、基礎理論から実装、さらにはビジネスへの応用まで含めた、スキルアップをすることができました。

 

この内容を無料で受けられるのは、非常にありがたいと思いました。機会があれば、絶対受講をおすすめいたします。

詳細は以下の記事も、ご参照ください。

8.ProbspaceでYouTube動画視聴回数予測コンペで9位入賞(2020年4月〜6月)

そして、GCIでの成果を発揮すべく、YouTube動画視聴回数予測コンペに参戦しました。

このコンペは、一見、テーブルコンペのように見えましたが、コメント欄を自然言語処理したり、サムネイル画像を画像処理したりするなど、工夫次第では、どんどん領域が広がる複合的なコンペでした。

今までのなかで一番難しく、一番楽しいコンペでした。

結果としては、446チーム中 9位に入賞することができ、金賞をいただきました!

f:id:kanriyou_h004:20200724001856p:plain

このコンペで一番苦労したのは、環境構築と維持でした。

いろいろな学習モデルを使う際に、テーブルデータ用の分析するための環境、自然言語処理をするための環境、画像処理をするための環境など、いろいろな環境をつくらなくてはならず、一個の環境をつくるために、前の分析を行うための環境が崩れてしまったりして、とても苦労しました。

また、たくさんのコードを作って、いろんなバージョンができたので、どの組み合わせだったか等の管理にも非常に苦労しました。

今回のコンペでは、単に機械学習という観点だけでなく、「システム開発」としての、効率的な運用も考えて行く必要があるということに気づけたとても有意義なコンペでした。

9.現在取り組み中の内容、そして今後にむけて

現在は、ProbspaceのRe:不動産コンペや、Kaggleのコンペに参戦しつつ、YouTubeコンペの反省を込めて、環境構築や管理に必要なDockerについて、 かめ@usdatascientistさんの以下の講座を受講して勉強中です。 これまで学習してきた内容は、まだ受講途中ですが、以下のとおりです。

また、このDocker講座が終わったら、自分のコードについて、適切にバージョン管理等ができるように、GitHubについても勉強していきたいと思います。

 

以上が、これまでの私の取り組んできた道のりになります。

G検定に出会ってから約1年半、いろいろ紆余曲折がありましたが、なんとかここまでやってくることができました。

まだまだ道半ばではございますが、世間様にお役に立てるアウトプットを出していけるよう、今後も精進してまいりますので、引き続きよろしくお願いいたします。

 

f:id:kanriyou_h004:20200723175611p:plain

Docker daemonとbuild contextについて学ぶ(米国AI開発者がゼロから教えるDocker講座)

これまでは、Dockerfileの中に記載された内容だけでDocker imageを作成してきましたが、Docker daemon や、build contextについて学習し、docker buildについて、さらに理解を深めました。

今回もかめ@usdatascientistさんの「米国AI開発者がゼロから教えるDocker講座」をUdemyで受講しながら進めています。

とても分かりやすく解説いただけますし、ハンズオン形式で講座が進むので、まさに「手で覚える」ことができるので、おすすめです!

www.udemy.com

では、振り返っていきたいと思います。

Docker daemonとbuild contextについて学ぶ

1.Dokcer daemonとbuild contextについて

これまで、DockerfileにDocker imageを作成するINSTRUCTION(命令)等を記載して、docker buildを実行する際は、引数にDockerfile自体ではなく、Dockerfileの入ったディレクトリを指定してきました。

これは、docker build実行時にDockerfileだけではなく、そのディレクトリ内にある他のファイルも使ってDocker imageを作成します。この、ディレクトリ内の「状況」を「built context」といいます。

また、build contextを受け取って、Docker imageを作成する役割を担っているのが、Docker daemonになります。

実際にこれまで、doker buildを実施してきたときに以下のように「Sending build context to Docker daemon」と表示されていて、contextをDocker daemonに受け渡していたことが確認できます。

f:id:kanriyou_h004:20200712201418p:plain

図1.contextをDocker daemonへ受け渡す

上記の場合は、Dockerfileだけしかディレクトリに入っていなかったので、「2.048kB」のデータを受け渡すだけですんでいますが、このディレクトリ内に不要なファイルが入っていると、受け渡す容量がそれだけ大きくなりますので、このディレクトリ内には、必要最小限のファイルだけにしておく必要があります。

2.build context内のファイルをDocker imageに取り込む(COPY)

build contextのディレクトリ内にあるファイルをDocker imageに取り込むためには、COPYというINSTRUCTION(命令)を使います。

では、build contextのディレクトリに「something」ファイルを作成して、このファイルをDocker image内のディレクトリにコピーします。

以下の内容を記述したDockerfileを作成します。

COPYについては、arguments(引数)に、コピーしたいホスト側のファイルと、Docker image側のコピー先を指定します。今回は、コピー先のディレクトリをあらかじめ、RUNを使って作成(mkdir)しておきます。

FROM ubuntu:latest

RUN mkdir /new_dir

COPY something /new_dir/

 docker buildを実行する前に、まず、ディレクトリ内のファイルを確認します。

ls

f:id:kanriyou_h004:20200716204252p:plain

図2.build contextとして受け渡されるファイル

これらのファイルがdocker buildを実行した際にDocker daemonに受け渡されます。
では、buildしていきます。

docker build .

f:id:kanriyou_h004:20200716204908p:plain

図3.docker buildを実行する

無事、Step3でCOPYも実行されて、Docker imageが作成できました。

次に、作成したDocker imageからコンテナを立ち上げて、「something」がコンテナ内にコピーされていることを確認します。

docker run -it a4be1c8a525e bash

f:id:kanriyou_h004:20200716205320p:plain

図4.コンテナを立ち上げる

ls /new_dir/

f:id:kanriyou_h004:20200716205504p:plain

図5./new_dir/ディレクトリ内に「something」ができていることを確認する

無事、build contextのディレクトリ内の「something」を、コンテナ内のディレクトリにコピーすることができました。

これで、事前に作成したファイルを、コンテナ内に持ち込むことができるようになりました。

3.build context内のtarファイルをDocker imageに取り込む(ADD)

今度は、単にbuild context内のファイルをコピーするのではなく、build context ディレクトリ内の圧縮ファイル(tarファイルなど)を、コピーして解凍するためにはADDというINSTRUCTION(命令)を使用します。

これは、build contextをDocker daemonに受け渡す際に、圧縮した状態のままで受け渡すことができますので、送信にかかる時間を短縮することができます。

では、試しに「hello」というファイルが入った「sample_folder」というディレクトリを圧縮した「compressed.tar」というファイルを、Docker image内に解凍するためには、以下のDockerfileを作成します。

ADDは、arguments(引数)に、解凍したいホスト側の圧縮ファイルと、Docker image側の解凍先を指定します。今回は解凍先にルートディレクトリを指定します。

FROM ubuntu:latest

ADD compressed.tar /

 docker buildを実行する前に、まず、ディレクトリ内のファイルを確認します。

ls

f:id:kanriyou_h004:20200716211818p:plain

図6.build context内のファイルを確認する

では、buildしていきます。

docker build .

f:id:kanriyou_h004:20200716212415p:plain

図7.docker buildを実行する

無事、Step2でADDが実行できました。

次に、作成したDocker imageからコンテナを立ち上げて、「compressed.tar」が解凍され、「sample_folder」が作成されていることを確認します。

docker run -it 4bfdf382a056 bash

f:id:kanriyou_h004:20200716212806p:plain

図8.コンテナを立ち上げる

ls /sample_folder/

f:id:kanriyou_h004:20200716213017p:plain

図9.sample_folderが作成されていることを確認する

無事、「compressed.tar」が解凍され、「sample_folder」ディレクトリと、その中に「hello」というファイルができていることが確認できました。

4.Dockerfileがbuild context以外にある場合

これまで、Dockerfileは、必ずbuild contextのディレクトリ内に配置してきました。

 しかし、Dockerfileを切り替えながら使っていきたい場合に、build contextのディレクトリ内にDockerfileをいちいち入れ替えていると面倒です。このような時に、Dockerfileをbuild contextのディレクトリ以外に、複数のDockerfileを作成し、docker build時に指定できると便利になります。

では、実際にDockerfileを指定して、docker build を実施していきたいと思います。

今回は、Dockerfileを図10のように、build contextのディレクトリの親ディレクトリに保存します。

f:id:kanriyou_h004:20200717211912p:plain

図10.build contextのディレクトリの親ディレクトリにDockerfileを作成する

Dockerfileには、以下を記載しました。

ubuntu のDocker imageに、「hogehoge」というファイルを作成して、bashを立ち上げるDockerfileになります。

FROM ubuntu:latest
RUN touch hogehoge
CMD ["/bin/bash"]

 Dockerfileを指定して、docker build を実行するためには、「-f」オプションを使って、Dockerfileを指定します。「..」は、親ディレクトリを表し、「.」は、カレントディレクトリ(現在いるディレクトリ)を表します。

docker build -f ../Docerfile .

f:id:kanriyou_h004:20200717213257p:plain

図11.Dockerfile を指定してdocker buildを実行する。

 無事、Docker imageが作成できました。

この方法を使うと、build contextのディレクトリと、Dockerfileの組み合わせを変えてdocker buildを行うことができます。

5.コンテナをコマンドのように引数を渡して使いたい(ENTRYPOINT)

 DockerfileにCMDでコマンドを実行した場合は、docker runを実行してコンテナを起動した時に、CMDで指定したコマンドか、docker runで引数として渡したコマンドのどちらかのコマンドが実行され、CMDで指定したコマンドに引数を渡すことはできません。

例えば以下の通りDockerfileで、Docker imageを作成した場合

From ubuntu:latest

RUN touch hogehoge

CMD["ls"]

docker runで実行できるのは、以下の通りです。

docker run -it [Docker image ID]

 → この場合は、CMDのコマンド(ls)が実行される

docker run -it [Docker image ID] pwd

 → この場合は、引数に渡したコマンド(pwd)が実行される

docker runの引数に、CMDのコマンド(ls)の引数は指定できず、いかのようには実行できません。

× docker run -it [Docker image ID] -la

上記のように、docker run を実行する際に、コマンドではなくDockerfileで指定したコマンドの引数だけを指定したい場合は以下のようにENTRYPOINTというINSTRUCTION(命令)を使用します。

このとき、ENTRYPOINTの引数には、実行するコマンドを指定して、CMDで、そのコマンドの引数を指定します。

こうすることで、docker runを実行した際に、ENTRYPOINTまでは、デフォルトで指定され、docker runで引数を渡す(CMDで指定した引数を上書きする)ことができます。

From ubuntu:latest

RUN touch hogehoge

ENTRYPOINT ["ls"]

CMD["--help"]

 では、実際にコンテナを起動していきます。

まずは、Docker imageをbuildします。

docker build .

f:id:kanriyou_h004:20200718201902p:plain

図12.docker buildを実行する

buildされたDocker imageからコンテナを起動します。

このとき、[ls]の引数として「-la」を指定してみます。

docker run -it 5aff4de5619b -la

f:id:kanriyou_h004:20200718202213p:plain

図13.docker run でENTRYPOINTで指定したコマンドに引数を渡す

無事、CMDで指定した[--help]オプションではなく、[-la]オプションが引数として渡され、カレントディレクトリにあるファイルの詳細情報が表示されました。

このようにコンテナを起動するときに、引数を渡してコマンドのように実行することができるようになりました。

6.Docker imageの環境変数を設定する(ENV)

DockerfileでDocker imageの環境設定をするためには、ENVというINSTRUCTION(命令)を使います。

ENVは、引数に環境変数名=設定する値と指定するか、環境変数の後にスペースを入れて設定値と指定することができます。

以下のようなDockerfileを作成して試していきます。

FROM ubuntu

ENV key1 value1

ENV key2=value2

では、試してみます。

docker build .

f:id:kanriyou_h004:20200718203817p:plain

図14.docker buildを実行する

次にコンテナを立ち上げて、環境変数の状態を確認します。

docker run -it 2af76fdfc73f bash

f:id:kanriyou_h004:20200718204001p:plain

図15.コンテナを立ち上げる

envコマンドで、環境変数の一覧を確認する。

env

f:id:kanriyou_h004:20200718204139p:plain

図16.環境変数の一覧を確認する

無事、key1にvalue1が、key2にvalue2が設定されていることが確認できました。

このようにENVというINSTRUCTION(命令)を使うことで、環境変数の設定もできました。

7.Dockerfile内のINSTRUCTIONの実行ディレクトリを指定する(WORKDIR)

 Dockerfileに記載されたRUNや、CMDなどのINSTRUCTION(命令)は、何も指定しなければ、すべてルートディレクトリで実行されます。

例えば、ディレクトリを作成して、そのディレクトリ内でコマンドを実行したい場合は、WORKDIRというINSTRUCTION(命令)でディレクトリを指定して実行します。

以下のようなDockerfileを作成して試していきます。

FROM ubuntu:latest

RUN mkdir sample_folder

WORKDIR /sample_folder

RUN touch sample_file

では、試してみます。

docker build .

f:id:kanriyou_h004:20200718210353p:plain

図17.docker buildを実行する

次にコンテナを立ち上げて、作成されたファイルを確認します。

docker run -it b062abc9c389 bash

f:id:kanriyou_h004:20200718210613p:plain

図18.コンテナを立ち上げる

WORKDIRで、ディレクトリを移動しているので、立ち上げ時のカレントディレクトリも、/sample_folderとなっています。

では、sample_folderファイルの中身を確認します。

ls /sample_folder/

f:id:kanriyou_h004:20200718210838p:plain

図19./sample_folder/の中身を確認する

無事、sample_folder内に[sample_file]が作成されていました。

これで、Dockerfile内でコマンドを実行する際のディレクトリを指定することができるようになりました。

 

今回の振り返りは以上になります。

今回、Docker daemonと、build context の仕組みを理解し、様々なINSTRUCTION(命令)を利用して、Dockerfileからコンテナ作成までのレパートリーが、かなり増強できたと感じました。

いろいろな、コンテナを作成して実際に手を動かしながら、自分のものにしてきたいと思います。

 

今回受講している「米国AI開発者がゼロから教えるDocker講座」では、もっと詳しくわかりやすくご説明いただけているので、ほんとうに良い勉強になります。

今後も、継続して受講して、もっと、Dockerを使いこなせるようになりたいと思います! 

www.udemy.com

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

 

f:id:kanriyou_h004:20200714220856p:plain

E資格取得に向けた勉強の振り返り(まとめ)

これまで投稿してきた、E資格関連の勉強の振り返り記事をまとめました。

今後、受験される皆さんの参考になれれば幸いです!

では、振り返ってまいりたいと思います。

受験体験記編

oregin-ai.hatenablog.com

応用数学

E資格対策振り返り(応用数学-固有値、固有ベクトル、固有値分解)

E資格対策振り返り(応用数学-特異値分解)

E資格対策振り返り(応用数学-確率)

E資格対策振り返り(応用数学-対数関数)

E資格対策振り返り(応用数学-情報理論-自己情報量)

E資格対策振り返り(応用数学-情報理論-エントロピー)

E資格対策振り返り(応用数学-情報理論-カルバック・ライブラー情報量(KLダイバージェンス))

E資格対策振り返り(応用数学-情報理論-クロスエントロピー)

E資格対策振り返り(応用数学-確率統計-オッズ比)

深層学習編

E資格対策振り返り(深層学習-ゲート付きRNN-LSTM)

E資格対策振り返り(深層学習-ゲート付きRNN-GRU)

E資格受験に向けて最適化(optimizer)を自分なりに整理!

E資格復習のつぶやき

E資格 復習のつぶやきまとめ 

 

取り急ぎ、簡単にまとめてみました。

今後、プログラミング編もまとめて行きたいと思います。

 

px.a8.net

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

DockerfileのINSTRUCTION(FROM,RUN,CMD)を学ぶ(米国AI開発者がゼロから教えるDocker講座)

今回は、前回学んだDockerfileのINSTRUCTION(命令)についてさらに理解を深めました。INSTRUCTIONは、FROM、RUN、CMDの三つになります。

今回もかめ@usdatascientistさんの「米国AI開発者がゼロから教えるDocker講座」をUdemyで受講しながら進めています。

とても分かりやすく解説いただけますし、ハンズオン形式で講座が進むので、まさに「手で覚える」ことができるので、おすすめです!

www.udemy.com

では、振り返っていきたいと思います。

DockerfileのINSTRUCTION(FROM,RUN,CMD)を学ぶ

1.FROMについて理解を深める

Dockerfileにおいて、FROMは、Docker imageを作成する際に、もとにするDocker imageを何にするかを指定するINSTRUCTION(命令)になります。Dockerfileの一番最初に、指定する必要があります。

ここで指定したDocker imageをもとに環境が構築されるので、OSのDocker imageか、OSを含むDocker imageを指定することになります。

たとえば、Docker fileに以下を記述することで、ubuntuの最新版のDocker imageからDocker imageを作成できます。

FROM ubuntu:latest

2.RUNについて理解を深める

 RUNは、コマンドを実行するINSTRUCTION(命令)になります。

コマンドを実行することで、Docker imageに、任意の変更を加えていくことができます。また、RUNを1行追加するごとに、Docker imageのLayer(層)が追加されていくことになります。

たとえば、以下を記述することで、testというファイルを作成し、ファイルの中に'hello world'という文字列を書き込みます。

RUN touch test

RUN echo 'hello world' > test

先ほどの、FROMと合わせて、以下のDockerfileを作成します。

FROM ubuntu:latest

RUN touch test

RUN echo 'hello world' > test

作成したDockerfileのディレクトリに移動して、以下のコマンドを実行します。

docker build .

f:id:kanriyou_h004:20200712165702p:plain

図1.docker buildの実行

作成されたDokcer image(bda713f6179f)からコンテナを起動して中身を確認します。

まずは、コンテナを起動します。

docker run -it bda713f6179f

f:id:kanriyou_h004:20200712170435p:plain

図2.コンテナを起動する

起動したコンテナでに、「test」ファイルが作成され、「hello world」が書き込まれていることを確認します。

cat test

f:id:kanriyou_h004:20200712170721p:plain

図3.testファイルの中身の確認

無事、「hello world」と書き込まれた「test」ファイルが作成されていることが確認できました。

3.Docker imageのサイズを小さくする工夫

先ほど、Docker fileにRUNを2行記載しましたが、RUNが実行されるたびに、Layerが追加されていくため、RUNを記述し続けるとDocker imageのサイズがどんどん大きくなってしまいます。

Dokcer imageをなるべく小さくするためには、Layer数を小さくするための工夫が必要になります。この工夫のために「&&」を使います。

たとえば、先ほどのDockerfileは、以下の通りRUNで実行する2つのコマンドを「&&」でつなげて記述することで、Layerをひとつ少なくすることができます。

FROM ubuntu:latest

RUN touch test && echo 'hello world' > test

4.Docker image上にパッケージをインストールする

 Dokcer image上にパッケージをインストールするためには、apt-getコマンドを使います。updateオプションで、パッケージのリストを更新し、installオプションでインストールするパッケージを指定します。例えば、「curl」、「nginx」をインストールする場合は以下の通りのDockerfileを作成します。

また、「-y」オプションを指定することで、インストールの際に、入力を求められた際に、すべて[y]で入力することができます。

FROM ubuntu:latest

RUN apt-get update && apt-get install -y curl nginx

上記のDockerfileからDokcer imageをbuildします。

docker build .

f:id:kanriyou_h004:20200712201418p:plain

<中略>

f:id:kanriyou_h004:20200712201235p:plain

図4.docker buildを実行する

なお、今回は最初の実行だったので、インストールに時間がかかりましたが、一度、Docker image のLayerが作成されている場合は、cacheが使われるため、以下のように時間が短縮できます。

docker build .

f:id:kanriyou_h004:20200712202352p:plain

図5.2回目のbuildはcacheが利用される

5.CMDについて理解を深める

 CMDは、コンテナが実行するデフォルトのコマンドを指定するINSTRUCTION(命令)になります。原則、Dockerfileの最後に一つだけ記載します。

記載方法は、CMD["実行するコマンド","引数1","引数2"]となります。

では、先ほどのDockerfileに、デフォルトのコマンドに「ls」コマンドを指定してみます。

FROM ubuntu:latest

RUN apt-get update && apt-get install -y curl nginx

CMD ["ls"]

上記のDockerfileからDokcer imageをbuildします。

docker build .

f:id:kanriyou_h004:20200712204102p:plain

図6.CMDでデフォルトのコマンドを指定したDockerfileでbuildする

この状態で、Docker imageから、コンテナを立ち上げます。

docker run b5597893e556

f:id:kanriyou_h004:20200712204744p:plain

図7.コンテナ起動時にLSが実行される

コンテナ起動時にlsが実行されて、ホームディレクトリのファイルが表示されることが確認できました。

なお、RUNとCMDは、どちらもコマンドを実行するINSTRUCTION(命令)になります。この2つのINSTRUCTIONの大きな違いは、RUNは実行後のDokcer imageのLayerが作成されますが、CMDはLayerが作成されないという点になります。

 

今回の振り返りは以上になります。

前回、基本を理解したDockerfileの記載し方について、掘り下げて理解することができました。

FROM、RUN、CMDを利用して、基にするDokcer imageに、パッケージをインストールして、コンテナを起動時にデフォルトで実行するコマンドを指定することができました。また、Dokcer imageのサイズをなるべく小さくするために、Layer数を少なくする記述方法についても学びました。

Dokcerを知れば知るほど、早く環境構築をしたくなってきました。自分の環境構築にも活用していきたいと思います。

 

今回受講している「米国AI開発者がゼロから教えるDocker講座」では、もっと詳しくわかりやすくご説明いただけているので、ほんとうに良い勉強になります。

今後も、継続して受講して、もっと、Dockerを使いこなせるようになりたいと思います! 

www.udemy.com

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

 

f:id:kanriyou_h004:20200712210639p:plain