Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[freee] 機械学習基盤におけるスポットインスタンスの有効活用

[freee] 機械学習基盤におけるスポットインスタンスの有効活用

【オンラインセミナー】「コンテナ × スポットインスタンス」 活用セミナーの資料です
https://aws-seminar.smktg.jp/public/seminar/view/2212

Hiroyuki Tanaka

June 10, 2020
Tweet

Other Decks in Technology

Transcript

  1. 4 MLOps Workflow
 自分たちが使いやすいようにDIY。現在は実験・開発フローを中心に構築中
 モデル学習・パイプライン化
 デプロイ・監視
 仮説検証・データ設計・初期実験 
 企画・設計
 請求


    管理
 コンテナベース開発環境
 Custom Backend Solvarg (Internal Tool) Remote Job code-server Self-hosted パイプライン管理
 学習基盤 EKS クラスタ
 Production EKS クラスタ

  2. 6 主なアプリケーション
 Kubeflow
 Jupyter Notebook Server機能を中心に使用中
 入れるとIstio周りも自動で構成してくれるのが便利
 モデル学習用のCRDなど、コンポーネントになっており選択的にインストールできる
 JupyterLab Custom

    Image & code-server
 チームメンバー向けに標準化されたNotebook環境とエディタ環境を提供
 Notebookでガリガリ実験するもよし、ターミナル&エディタでLinux環境(Pod)に入って開発してもよし
 Airflow
 プロダクション向けのデータ・学習パイプラインを実行する
 コードは独立したリポジトリで一元管理
 Solvarg
 社内製のKubernetes上で動くリモートジョブ実行ツール
 Airflowと連携出来るようになっており、実験フェイズからプロダクションフェイズにスムースに移行する事が出来る

  3. 8 EKS Nodegroupsの設計
 スポットインスタンスをフル活用する
 最低限の基幹系Podのみをオンデマンドノードに配置し、それ以外のジョブ実行や
 長時間動かすプロセスが無いものはスポットノードに配置して一旦運用中
 
 
 例:
 


    Istio、coredns、cluster-autoscaler -> オンデマンドインスタンス
 学習ジョブ、Jupyter Notebook Server -> スポットインスタンス
 
 
 運用してみて問題が出てきた段階でスポットからオンデマンドに切り替えればいいという割り切りでやってます
 Pod単位で気軽に設定・変更出来るのはEKSの強み

  4. 12 Podの振り分け方法
 Taints/TolerationsとNodeAffinityを組み合わせてどのノードに配置したいかを制御
 tags: k8s.io/cluster-autoscaler/node-template/taint/system: ":NoSchedule" k8s.io/cluster-autoscaler/node-template/label/ng-name: system k8s.io/cluster-autoscaler/enabled: "true"

    labels: ng-name: system taints: system: ":NoSchedule" system
 tags: k8s.io/cluster-autoscaler/node-template/taint/job: ":NoSchedule" k8s.io/cluster-autoscaler/node-template/label/ng-name: job k8s.io/cluster-autoscaler/enabled: "true" labels: ng-name: job taints: job: ":NoSchedule" job
 tags: k8s.io/cluster-autoscaler/node-template/taint/nvidia.com/gpu: "true:NoSchedule" k8s.io/cluster-autoscaler/node-template/label/ng-name: g1 k8s.io/cluster-autoscaler/enabled: "true" labels: ng-name: g1 k8s.amazonaws.com/accelerator: nvidia-tesla-v100 taints: nvidia.com/gpu: "true:NoSchedule" job-gpu
 tags: k8s.io/cluster-autoscaler/node-template/label/ng-name: default k8s.io/cluster-autoscaler/enabled: "true" labels: ng-name: default default
 Toleration & Node Affinity 有り -> 選べる
 Spot Spot Spot Toleration & Node Affinity 無し -> defaultにしか行けない

  5. 14 Cluster AutoscalerとSpot Allocation Strategy
 Cluster Autoscaler
 • いろんなサイズのジョブ=インスタンスが立ち上がるので、expander=least-wasteに設定
 ◦

    least-waste: CPU/Memoryの空きが少なくなるように新規ノードを立ち上げる
 ◦ デフォルトはランダム
 
 ちょっとした設定ポイント
 spotAllocationStrategy
 • スポットインスタンスノード上で動くジョブの中断機会を減らすため、スポットインスタンスの配分戦略をデフォル トのlowestPriceではなくcapacityOptimizedにしている
 nodeGroups: - instancesDistribution: onDemandBaseCapacity: 0 onDemandPercentageAboveBaseCapacity: 0 spotAllocationStrategy: capacity-optimized instanceTypes: - r5.xlarge eksctl設定例

  6. 15 Tips: GPU付きのJupyter Notebookを起動する
 Kubeflow標準ではTolerationを付与できない為、GPUインスタンス上でJupyter Notebook Serverを起動できない
 
 → ExtendedResourceToleration

    Admission Controllerを利用すると、Taintsを自動で付与できる
 ExtendedResourceTolerationで tolerationを自動付与 
 tolerations: - key: "nvidia.com/gpu" operator: "Exists" effect: "NoSchedule" GPUノードが起動 Taintsをセットする事で予期せぬPodがGPU ノードに配置されることを防ぐ 
 • 尚、ExtendedResourceTolerationはEKSで有効化されていないので、同様の機能を持つadmission webhookを自作した
 ◦ https://github.com/roy-ht/extended-resource-toleration-webhook

  7. 16 まとめ
 今後挑戦したいこと
 • 予期せぬ中断に対する対策の標準化
 ◦ Airflowジョブや学習ジョブのリトライ時の挙動を統一して途中から再開できるようにしたい
 ▪ https://github.com/kube-aws/kube-spot-termination-notice-handler
 •

    ただ猶予が二分しかないのでデータ処理・機械学習の場合は常にチェックポイントをS3などに保存して再開可能 にすべき
 • Advanced Security: SA Roleの細かい設定やOpen Policy Agentの導入
 • EKSとスポットインスタンスを活用した機械学習ワークロード向けの開発基盤の構築例を
 ご紹介しました
 • 開発者の知識と権限をAWSとKubernetesでうまく分離できる所が使いやすい
 ◦ 一般の開発者はKubeflow/Kubernetesの最低限の使い方を覚える ◦ メンテナはEKSで運用コストを低く抑えながらk8sエコシステムの恩恵を受けられる ▪ (端的に言うとeksctlは神) • 欲を言うと、もう少しノードのプロビジョニングが速いと嬉しい