#データサイエンティスト育成を支える技術

## なんでドコモがアドベントカレンダー？2020

お久しぶりです。@dcm_chidaです。
今年もアドベントカレンダーが始まりましたね。

我々NTTドコモは2018年から毎年Qiitaアドベントカレンダーに取り組んでおります。

昨年のカレンダーではQiita民の皆様からたくさんの反響や応援の声をいただきました。おかげさまで今年もこうしてアドベントカレンダーに参加することが出来ます。圧倒的感謝！

[QiitaZine](https://zine.qiita.com/original/202011-ntt-docomo/)でもピックアップしてもらいました！

![qiitazineスクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319677/5c637984-a1d1-6a3d-7f7e-a392b55abdd2.png)



特に今年は**NTTドコモのR&D部署全体で**アドベントカレンダーを立ち上げております。ドコモの技術や取り組みを紹介するような記事をたくさん投稿していこうと思うので、高評価＆購読よろしくお願いします！

[NTTドコモ R&D Advent Calendar 2020 - Qiita](https://qiita.com/advent-calendar/2020/nttdocomo)

[NTTドコモ R&D 控え室 Advent Calendar 2020 - Qiita](https://qiita.com/advent-calendar/2020/nttdocomo_waiting_room)

Twitterやはてなもチェックしているのでコメントお待ちしております！


## はじめに

さて、「データサイエンティスト育成」というテーマですが、みなさんデータサイエンススキルを身につける最も効果的な方法は一体なんだと思いますか？



私個人としては「**機械学習コンペティションに参加すること**」だと思ってます。

最近ではデータ分析に関する資格やプログラミングスクールがたくさんあります。もちろんそういった教科書的なお勉強は必要ですが、知識をインプットするだけでは実際の業務に応用できません。

より実践的にアウトプットする場が必要です。その選択肢の一つとして機械学習コンペティションが挙げられます。KaggleやSIGNATEなどが有名ですね。

我々NTTドコモR＆Dではそうした機械学習コンペティションの一つである**KDD Cup**に参加しています。


本記事ではNTTドコモR&Dにおける「**KDD Cupを通したデータサイエンティスト育成**」と「**それを支える技術**」について紹介していきたいと思います。

### 対象とする人

- R＆D部門で機械学習コンペに取り組もうとしている
- データサイエンティスト育成に興味がある

### 主な内容

- NTTドコモR&DにおけるKDD Cupへの取り組み
- 機械学習コンペ用のAWS開発環境の運用ノウハウ

## KDD Cup

### KDD Cupとは？

KDD Cupとは権威ある国際学会KDD(**K**nowledge **D**iscovery and **D**ata mining)で開催される機械学習コンペティションのことです。

>KDD Cup is the annual Data Mining and Knowledge Discovery competition organized by ACM Special Interest Group on Knowledge Discovery and Data Mining, the leading professional organization of data scientists.

1997年から毎年開催されており、今年で24回目となる歴史あるコンペティションです。世界中の研究機関や企業が数多く参加し、各々のデータ分析技術やプログラミング能力を競い合います。最近では特に中国企業や大学が多く参加していますね。

過去コンペは[こちら](https://www.kdd.org/kdd-cup)にまとまっています。

**KDD Cupは毎年どんなテーマが選ばれるかわかりません。**最近はグラフ分析やAutoML、強化学習などチャレンジングなテーマが選ばれることが多いです。Kaggleでは好きなテーマに参加すれば良いですが、KDD Cupではこちらに選択権がありません。

そうなると当然専門外のお題になることがほとんどなので、毎年毎年**地獄のような論文サーベイ🔥**[^manabi]から始まることになります。今年のテーマであるグラフニューラルネットでも論文やコードを大量に調べました。いやぁ大変だった。

[^manabi]: その分学びも大きいですが…


ちなみに似たようなコンペは[NeurIPS](https://neurips.cc/Conferences/2020/CompetitionTrack)や[RecSys](https://recsys.acm.org/recsys20/challenge/)など他の国際学会でも開催されています。



### NTT DOCOMO LABS

ドコモR&Dは2016年からKDD Cupに参加していますが、そのためにデータサイエンティスト有志が集まってチームを組みました。その名も「**NTT DOCOMO LABS**」です。

![スクリーンショット 2020-08-21 13.46.26（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319677/d1cbc200-d1ec-4509-73bd-e4dc5d614d5f.png)


チームメンバーは画像処理、ネットワーク技術、セキュリティなど様々な分野から募っています。ガッツリ研究寄りの人からサービス開発専門の人まで様々です。年次も入社3年目の若手からオーバエイジ枠の選手[^60]まで様々です。

[^60]: 昨年まで60代！？の4番打者プログラマがいました。

結成当初は少数精鋭感がありましたが、**最近では人材育成の意味合い**も強くなってきています。昨年は若手社員が続々参戦し、20人以上の参加者が集まりました。来年はもっと増えると思います。

私個人としては2018年に初めて参加して今年で3回目でしたが、**基本的なデータ分析スキルは全てKDD Cupで学んだ**と言っても過言ではありません。


### データサイエンティスト育成計画

機械学習コンペで期待できるのは「個人としてのデータ分析スキルアップ」だけではありません。


普段と異なるチームで活動することによる「**シナジー効果**（相乗効果）」が期待できます。

通常のR&D組織でのあるあるを挙げてみましょう。

>- ほぼ固定メンバーなので他のチームの業務内容は謎に包まれている
>- 技術に特化したスペシャリストが身近にいない
>- 本業務に関わる技術ばかり身についてしまう
>  - もしくは定型作業化してしまっている
>- 若手社員にアピールの場がなかなか回ってこない


うぅ、何だか胃が痛くなってきますね…😐

これに対して我々NTT DOCOMO LABSのような横断型組織では多くのメリットがあります。

>- 担当や部署を跨いだコネが出来る（技術の貿易）
>- データ分析が得意なスペシャリストとOJT的にチーム開発が出来る
>- 最先端の技術を調査・取得し、時には本業務に応用することも可能
>- 若手でもデータ分析力があれば重宝される

このように機械学習コンペ特殊部隊を組織することによって「データサイエンティストを育む土壌🌱」を形成しているわけです。


### これまでの成績

我々は2016年からKDD Cupに参加していますが、これまでの結果を公開してみます。

| Year | Track | Result | Description |
|:-----------:|:------------:|:------------:|:------------:|
| 2020      | ML Track1 (Task1)        | **7位**  🎉  |ECサイトのクリック予測 |
|      | ML Track1 (Task2)     | 59位  |ECサイトのバイアス除去|
|        |ML Track2        | **4位** 🎉  |Graph Adversarial Attack|
|  |AutoML Track |15位| グラフデータのAutoML|
|        |RL Track        | **3位**  🥉  | タクシー配車の最適化 |
|   2019     |Regular Track1 Task1       | 114位   | 最適な交通経路の予測|
|        |Regular Track1 Task2       | **1位** 🥇   |最適な交通経路の提案 |
|        |AutoML Track  | Check Phase　敗退 | テーブルデータのAutoML|
|        |Humanity RL Track	|29位 |マラリア感染防止の方策 |
|   2018    |Regular Track        | 16位 |大気汚染の時系列予測 |
|   2017     |Regular Track Task1       | 90位   | 交通渋滞時の移動時間予測|
|        |Regular Track Task2      | 70位   | 交通渋滞時の交通量予測|
|   2016     |Regular Track        | **Finalist** 🎉 | 論文の採択予測|


これがこれまでの対戦記録です。報道発表などでは「良かった結果」ばかりが出ていますが、実際は「悪かった結果」もたくさんあります。

30日間毎日サブミットしたり…

メモリエラーで大爆死したり…

ポルナレフ状態でコンペが終了したり…

振り返れば、泥臭い努力を何年も積み重ねてきました。

個人的に一番思い入れが深いのが2019年のAutoMLTrackです。自分がリーダーを努めていたのですが、最終的にメモリエラー[^automl]で脱落してしまいました。そこそこ良い結果が狙えそうだっただけにショックが大きかったですね。辛すぎて有休を取ってひとり傷心温泉旅行に行きました。いい思い出です。

[^automl]: エラーハンドリングも含めてコードを書くのがAutoMLです。


なんだか宣伝っぽくなってきてしまったので、今回はここまで💧

今年のアドベントカレンダーでもKDD Cup関連のものが多く投稿されると思うので詳細はそちらをご覧ください。


## データサイエンティスト育成を支える技術

さて、こんな感じでドコモR＆DではKDD Cupに取り組んでいるのですが…

**一体どうやって機械学習コンペ用の開発環境を用意するのか？**

という問題が生じます。

個人PCでは流石にキツいです。

世界レベルのデータ分析コンペで戦うには高性能なGPUやメモリ盛り盛りのサーバが必要になってきます。当然AWSやオンプレサーバなどを利用することになりますが、そうなると様々な障壁が生じます。

- データサイエンス以外のスキル不足[^barabara]（インフラ構築など）
- セキュリティ意識の統一
- 運用コストの管理

[^barabara]: 基本的なデータ分析スキルはある程度保証されていますが…

我々NTT DOCOMO LABSはこうした問題を解消するために、データ分析自己研鑽用のAWS環境を構築しました。

本章ではそうした**データサイエンティスト育成を支える技術**についてまとめたいと思います。

### データ分析自己研鑽用のAWS環境

コンセプトはこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319677/e77d55d0-6ab3-0cf7-8724-3152ecbab662.png)


主な利用用途としては

- 機械学習コンペ用の開発環境
- （教科書レベルの）データ分析スキル向上
- 社内勉強会向けのアドホックな検証

などを想定しています。

基本的なネットワークやセキュリティ設定は社内でAWSに強い人を何人か引き込んで整備しました。データ分析に必要な環境は一通り揃えています。

特に毎年KDD Cupの期間は高性能のサーバがズラッと並びます。月間コストもぶっ飛んでいく[^cost]ので毎年ヒヤヒヤしますが、もはや恒例行事です。

[^cost]: 「こんなにお金使ってるんだから結果を出さなければっ！」の精神で今年は結果を残せました。

以下、運用面でのTipsをいくつか紹介していきたいと思います。

### Tips① 初回ログイン時にMFA設定を強制させる

AWS初心者の最初の関門は「**IAMユーザとしてログインすること**」です。

我々の環境ではまずはIAMユーザとしてログインして、MFAを設定するところからやってもらいます。MFAを設定しないと、（基本的な操作を除き）ほとんど全ての操作が制限されます。

IAMポリシーを一部抜粋するとこんな感じです。

```json:IAMポリシー（一部抜粋）
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "LimitRegion",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "aws:RequestedRegion": [
                        "us-east-1",
                        "ap-northeast-1"
                    ]
                }
            }
        },
        {
            "Sid": "BlockAnyAccessUnlessSignedInWithMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:*",
                "s3:*",
                "codecommit:*",
                "sagemaker:*",
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt",
                "kms:GenerateDataKey",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:DescribeKey"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        },

"以下、ゴリゴリにカスタマイズされたjsonが続く…"

}
```

AWSが本当に初めての人は「IAM」と言う概念を知りません。

そんな方々にはまず最初に「何でもかんでも自由にできると思ったら大間違いや！**生殺与奪の権は管理者が握ってるんだぁ！**」と言うことを実感してもらいます。


### Tips② SageMakerを中心とした開発環境整備

次に関門となるのは「開発用のインスタンスの構築」です。

ここではSageMakerのノートブックインスタンス機能を利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319677/de31237a-a84b-c676-df50-fec48de9e1f1.png)

普通はEC2でインスタンスを構築して…SSHでログインして…ライブラリをインストールして…など面倒な作業が必要ですが、純粋にデータ分析だけやりたい人にとっては単なる重労働でしかありません。**下手に設定をミスするとインスタンスの乗っ取りや暗号通貨のマイニングに使われてしまう**可能性もあります。

[^juroudou]: しっかりAWSを学んでもらいたければ、VPCやSGの設定などを一からやってもらう必要があります。



単純にKDD Cupに参加するのが目的ならJupyter Notebook（もしくはJupyter Lab）が使えれば十分です。わざわざEC2インスタンスを作成して面倒な作業をする必要はありません。SageMakerのノートブックインスタンスではデフォルトでデータ分析に必要なライブラリ一式は揃っていますし、必要ならGPUも利用可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319677/875d5933-1543-0a40-5da8-29f1369c36a4.png)


設定も簡単です。VPCやSGなどは予め作っておいて、利用者にはそれを選択してもらうだけです。SSHログインも一切不要です。設定ミスや鍵紛失のリスクを最小限に抑えることができます。

このようにSageMakerを利用することで、データ分析者の負担を軽減しつつ、セキュアで高性能な環境構築をすることが可能になります。



### Tips③ CodeCommitによるコード管理

趣味で参加する場合はGitHubやらGitLabでコードを管理すれば良いのですが、組織としてコンペに参加する場合は社内ルールなど少々面倒な事務手続き[^aruaru]が必要です。**初心者が適当に公開リポジトリを作成して、アクセスキーが世界中にオープンになってしまったら情報漏洩になりかねません。**

[^aruaru]: 日系企業R&Dあるあるですね。

そこで導入するのがCodeCommitです。CodeCommitはAWS提供のコード管理サービスです。GitリポジトリをAWS環境にセキュアにホストすることが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319677/6d9e8227-ec89-207e-94b5-f4c7cb7f7178.png)


CodeCommitは前述の**SageMakerのノートブックインスタンスにダイレクトにアタッチできる**のが嬉しいところです。先程のJupyter Labのキャプチャ画面の左側を見ればわかりやすいと思います。

あまり多用すると意外とコストが高くつくのが難点ですが、コンペが終わったら消せば良いのでここは我慢します。

また.ipynb形式のファイルはコンソールからうまく表示できないのも難点です。ここはギリギリ我慢できませんが、どうせSageMakerで開くからなぁ…🤔

あと、シンタックスハイライトも結構雑なんだよなぁ…🤔

今後のアップデートに期待。

### Tips④ GuardDutyを有効化する

セキュリティ周りは自動化しておきたいのでGuardDutyを有効化しておきます。


>![](https://d1.awsstatic.com/Security/Amazon-GuardDuty/GuardDuty-tile-1.18a4201c6e098730b17f683c8b86b630223b4cda.png)
>Amazon GuardDuty は、AWS アカウントとワークロードを保護するために悪意のある操作や不正な動作を継続的にモニタリングする脅威検出サービスです。アカウント侵害の可能性を示す異常な API コールや不正なデプロイなどのアクティビティをモニタリングします。インスタンスへの侵入の可能性や攻撃者による偵察も検出します。[Amazon GuardDuty（インテリジェントな脅威検出） | AWS](https://aws.amazon.com/jp/guardduty/)

ここら辺は説明不要ですね。

- ルートアカウントが使われた！
- 普段使わないsrcIPからコンソールにログインしてきた！
- IAMポリシーの権限が変更された！

このような自体が発生した場合、自動で検出してくれるのでとても便利です。ぜひ有効化しておきましょう。

デフォルト機能では結構見にくいので、うまくダッシュボード化するといいと思います。
![スクリーンショット 2020-11-28 13.47.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319677/c4a8ba99-0935-b42f-1431-6c036e68cdab.png)


### Tips⑤ Billingを見てもらう

Billingは**意図的に「参加者全員が見える状態」**にしています。

AWS初心者が不安に思うこと第一位は「これを使うといくらくらいお金がかかるんだろうか？」だと思います。

- インスタンスタイプはどれを選べばいいの？
- メモリもっと増強して大丈夫かな？
- DeepLearningAMIってお金かかるの？

こういう恐怖心が成長を妨げます（多分）。クラウド破産を恐れていては自己研鑽が進みません！

- GPUのP3とP2では一時間で数百円も差がある！
- インスタンスを立ち上げっ放しにすると大変だー💸
- Lambda関数…やっすい！サーバレスすげぇ！

こういうコスト感覚を身に付けてもらえるように、敢えて見えるようにしています。

デフォルト設定ではルートユーザしか見ることが出来ませんが、IAM権限によるアクセスを有効化してIAMポリシーをカスタマイズすれば見えるようになります。

```json
        {
            "Sid": "ViewBilling",
            "Effect": "Allow",
            "Action": "aws-portal:ViewBilling",
            "Resource": "*"
        }
```


[IAM ユーザーに自分のアカウントの請求情報の表示を許可する](https://aws.amazon.com/jp/premiumsupport/knowledge-center/iam-billing-access/)


Slackなど利用できる場合は毎朝コスト通知するbotを設定しておくと、みんな見てくれるようになると思うのでオススメです。インスタンス立ち上げっぱなしやGPUフル稼働させていると見廻隊の誰かが気づいてくれます。月間予算を設定しておくのも大事ですね。

![スクリーンショット 2020-11-24 22.42.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319677/9f5e2cae-fc3d-b18f-804a-964ef392f2f8.png)




## まとめ

本記事ではドコモR&DのKDD Cupへの取り組みとそれを支える技術について紹介しました。

私はどうかわかりませんが、きっと来年のKDD CupにもNTT DOCOMO LABSは参加すると思います。対戦希望の方々は是非参加してみてください。

それではみなさん、良い年末を…
じゃなくて、アドベントカレンダーはまだまだ続きますのでお楽しみに。

## 参考

- [NTTドコモが世界最高峰のデータ分析競技会「KDD CUP 2020」の3部門で入賞　タクシー配置/攻撃×防御/BERTでAIビッグデータ分析能力を実証 | ロボスタ](https://robotstart.info/2020/08/28/docomo-kdd2020.html)
- [【NTTドコモのAI予測技術 (1/3)】ドコモが世界最高峰のAIデータ分析競技会「KDD CUP 2019」で第1位に輝く　大気汚染問題の解決を課題に | ロボスタ](https://robotstart.info/2019/09/24/docomo-ai-sp-01.html)

- [Kaggleに登録したら次にやること ～ これだけやれば十分闘える！Titanicの先へ行く入門 10 Kernel ～ - Qiita](https://qiita.com/upura/items/3c10ff6fed4e7c3d70f0)
- [Kaggle事始め - Qiita](https://qiita.com/taka4sato/items/802c494fdebeaa7f43b7)
- [AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ - Qiita](https://qiita.com/tmknom/items/303db2d1d928db720888)
- [AWSアカウントを作成したら最初にやるべきこと -セキュリティ編- - Qiita](https://qiita.com/yanyansk/items/3a989b70d2d3d49eff16#guardduty%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E8%A1%A8%E7%A4%BA)