継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

『Dockerをさらに便利に使いたい! Kubernetes入門』を読んだ

タダです。

Software Designの2018年3月号でKubernetesの入門記事が載っていたので、読んだ内容をまとめていきます。

gihyo.jp

Kubernetesの特徴

  • Kubernetesはコンテナ化されたアプリケーションのデプロイ、設定、管理を自動化するOSS(コンテナオーケストレーションツール)
  • Kubernetesの特徴として4つある
    • 宣言的設定(デプロイした結果のアプリの望ましい状態を定義する)により冪等性を担保
    • 自己回復機能(セルフヒーリング)
    • VMを抽象化して、管理するサーバーを気にする必要がなくなる
      • サーバを1つの大きなリソースプール(クラスタ)として管理する
    • ベンダーロックインされない
  • Kubernetesの仕組みについて、⑴Kubernetesのオブジェクト、(2)アーキテクチャと登場人物の観点で整理する
    • Kubernetesオブジェクト(VM、永続ストーレジ、ロードバランサーなどをアプリケーション志向に抽象化したもの)
      • Podは、Kubernetesにおけるデプロイの最小単位(ネットワークとボリュームをまとめたグループ)。実体はjsonまたはYAML
      • Deploymentは、Podの定義をもとに指定されたPodのレプリカの数に実行されているPodの数が足りなければPodを作成する
      • Serviceは、Podの集合に対するアクセスをL4ロードバランスする機能を提供するオブジェクト
        • ClusterIPというクラスタ内でのみ有効な仮想的なIPあどれすをもって、それに対するアクセスはラベルセレクタと呼ばれるラベルに対するクエリでグルーピングされたPodの集合に分散する
  • Kubernetesアーキテクチャと登場人物
    • Kubernetesはマスターコンポーネントとノードコンポーネントで構成される
    • kube-apiserverは、KubernetesAPI(REST、CRUD、認証認可を行う)
      • ステートレスで水平スケールさせる
    • etcdは、CP型の分散キーバリューストア
      • 唯一のデータストアで、クラスタのすべての情報はetcdに保存される
    • kube-schedulerは、Podの適切なスケジューリングを行う
    • kube-controller-managerは、Kubernetesオブジェクトの更新をトリガに、クラスタの状態を望ましい状態に一致させるDeploymentオブジェクトなどのビジネスロジックを実行する
    • kubeletは、インストールされている自身のノードへのPodのスケジューリングを監視してコンテナランタイムを操作する
    • kube-proxyは、Serviceオブジェクトに記述されたネットワークルールを実現するためのパケット転送をそうする
    • コンテナランタイムは、kubeletから操作され、コンテナの取得と実行を行う

Kubernetesのメリット

インフラの課題

  • マイクロサービスの管理のデプロイが楽になる
  • サーバの管理コストの削減(コンテナ技術でサーバとアプリケーションを分離する)
  • クラウド上にKubernetesを構築する場合、IaaSより上のレイヤーで構築するためポータビリティがある
  • Kubernetesはアプリケーションを分離して管理するため、1つのサーバ上に複数のアプリを稼働させられるからリソース効率がよい
  • Kubernetesはサーバの死活監視やリソースの逼迫の監視を自身で行う
    • サーバ1台1台を管理することから解放され、クラスタ全体のリソースもクラスタオートスケーラで柔軟に行う

アプリケーションの課題

  • Kubernetesは言語とランタイム、ライブラリをまとめて1つのイメージ化するため、ランタイムとライブラリの依存関係が内包されている
    • 再現性の高いデプロイが可能になる
  • サービスディスカバリによりアプリケーションごとに接続情報(IP/ポート番号など)をもてるため、複数環境を簡単に作れる
  • Kubernetesはアプリケーションの定義としてヘルスチェックが設定可能で、問題があれば自動で再起動が可能
  • minikubeというツールによるローカル環境での確認が可能

Kubernetesをローカルで動かす

※実際の動作させた結果は別途アップします

以上がまとめになります。

2/19~2/24 AWSブログ

タダです。

今週のAWSブログのアップデートをまとめていきます。

1、Azure MFAサーバーを使用したAmazon WorkSpacesの多要素認証(Multi-Factor Authentication)

  • WorkSpacesの認証をAzure MFAサーバーを利用する紹介記事です
  • AWS側にAD ConnectorとMicrosoft ADをセットアップし、Azure側にMFAサーバーを用意してRADIUS認証のクライアントとして、AWS側のディレクトリを指定する形で実現しています

2、WordPress 向けの Amazon Polly プラグインが Bitnami の AMI にプレインストールされました

  • BitnamiのAMIにWordPress向けPollyのプラグインがデフォルトでインストールされるようになりました

3、インターリージョンVPCピアリングにリージョン追加。新たに9つのリージョンで利用可能に

4、MySQL5.7互換のAmazon AuroraでJSONを利用する

  • Aurora MySQL 5.7互換のものでJsonを使用するための方法を紹介している記事になります

5、Lumberyard Beta 1.12 新たな年と新しいエンジン

  • Lunberyard Beta 1.12がリリースされました
  • 今回のアップデートで7つの機能が追加されました

6、提供開始– AWS Serverless Application Repository

  • Serverless Application Repository がGAされました
  • 起動はLambdaの画面より行い、様々なテンプレートをサーバレスアプリケーションの管理、デプロイができるのですね

    AWS Serverless Application Repository を使用すると、ウェブやモバイルのバックエンド、イベントやデータの処理、ログ記録、モニタリング、IoT といった一般的なユースケース向けのコードサンプル、コンポーネント、アプリケーション一式を短時間でデプロイできます。各アプリケーションには、使用する AWS リソースを定義する AWS Serverless Application Model (SAM) テンプレートが付属しています。公開によって共有されたアプリケーションには、アプリケーションのソースコードへのリンクも含まれています。Serverless Application Repository の使用に追加料金はかかりません。デプロイするアプリケーションで使用される AWS リソースに対してのみお支払いいただきます。

7、Amazon GameLift FleetIQとスポットインスタンスでコストを最大90%削減

  • GameLiftにてスポットインスタンスの使用ができるようになりました
    • また、プレイヤーのレイテンシ・インスタンスの価格・スポットの中断率をふまえてゲームセッションのキューイングを行うFleetIQも追加されました
    • FleetIQによりスポットインスタンスのコスト削減をやりつつ、サーバーの高稼働率を維持することが可能です

以上が今週のアップデートまとめになります。

ゼロから始めるディープラーニング 8章

タダです。

今回は8章のディープラーニングについての勉強まとめです。最後の章になります。

※記事は理解ができるたびに何度もアップデートしていこうと思います。 www.oreilly.co.jp

目次

なお、各章の内容は次の通りです。

8.1

  • CNNのネットワークを深くしたものをVGGという
    • 重みの初期値にHeの初期値、重みパラメーターの更新にAdamを使う
    • 後段の全結合層では、Dropoutレイヤを使う
    • 画像認識度は高く、誤認識率も低いネットワークを構成できる
  • 画像の認識精度を高めるための手法として以下のものがある
    • アンサンブル学習
    • 学習係数の減衰
    • Data Augmentation(データ拡張)
      • Data Augmentationは入力画像(訓練画像)をアルゴリズムによって人工的に拡張する
      • この手法で訓練画像を効率的に増やせれば、認識精度を向上できる
  • 層を深くすることの重要性について、理論的に多くのことはわからない
    • ただ、層を深くすることで階層的に情報を渡せる(前の層で抽出した特徴を次層で情報として使えるためより高度な学習ができる)
    • 層を深くするメリットは、ネットワークのパラメータ数を少なくできる
      • 層を深くすれば学習データを少なく、高速に学習ができる(層を深くすると学習する問題を階層的に分解することができる)

8.2

  • ディープラーニングが注目を浴びるきっかけになったのはILSVRCがきっかけといわれている
  • ImageNetは100万枚を超える画像のデータセット
  • 近年、VGG、GoogLeNet、ResNetは有名なネットワーク
  • VGGはCNNだが畳み込み層や全結合層(重みのあるそう)を全部で16層(もしくは19層)まで重ねている点が特徴
    • 3 × 3の小さなフィルターによる畳み込み層を連続して行っているところが注目ポイント
  • GoogLeNetもCNNだが、ネットワークが縦方向の深さだけでなく、横方向にも深さがある
  • ResNetはMicroSoftによって開発されたネットワーク
    • 層を深くしすぎるとうまく学習できない問題があるが、ResNetではスキップ構造やバイパスという仕組みを使って、左記の問題を解決する

8.3

  • ディープラーニングの高速化に役立っているのがGPU
    • ディープラーニングでは大量の積和演算または行列内積を行うが、このような大量並列演算はGPUの得意分野
    • GPUの普及で学習の高速ができたが、その時間を短くしたいという要望が当然のように出てくるが、これはディープラーニングの学習をスケールアウトすることで対処する(分散学習)
      • 例えば、Tensorflow、CNTKなど
    • 使用するGPUが増えれば学習速度も向上する
  • 分散学習で難しいのがどのように計算を分散させるか

8.4

  • ディープラーニングの実用例として以下のものがある
    • 物体検出(Amazon Recognitionみたいな/CNNベースの手法)
    • セグメンテーション
    • 画像キャプション生成

8.5

ディープラーニングの今後の話のため割愛

まとめ

以上がゼロから作る Deep Learningの全章まとめになります。

一冊分の毎週の学習が完了したので振り返りをします。

よかったこと

  • 隔週でブログを書くため本を読み進める癖がついた
  • 業務以外の知識の習得のきっかけができた
    • 社内でも輪読会を行っています
  • 以前よりディープラーニングの専門用語への抵抗が少なくなって、専門の文章でも読み進めたりできるようになった

よくなかったこと

  • 毎週1章分を読み進めるということができていない週があった
  • 理解が追いついていない部分が多々ある
    • もう一度読んだり、関連書籍・ページなどで補完する
  • 数式に抵抗があり、どのような計算を行っているのかがわかりきっていない
    • JupyterNotebookで数式処理をやってもらったらわかりやすかったのでこちらで勉強したい

来週からはコンテナの勉強をしようと思います。

こちらの本が積読になっているので消化します。 http://amzn.asia/6xzNUQm

ゼロから始めるディープラーニング 7章

タダです。

今回は7章の畳み込みニューラルネットワーク(CNN)についての勉強まとめです。 社内での輪読会に備えて先行で7章のまとめを行います。

※記事は理解ができるたびに何度もアップデートしていこうと思います。 www.oreilly.co.jp

目次

なお、各章の内容は次の通りです。

7.1

  • 畳み込みニューラルネットワーク(CNN)は、画像認識や音声認識などいたるところで使われている
  • これまでのニューラルネットワークとの違いは以下の2層があること
    • Convolutionレイヤ(畳み込み層)
    • Poolingレイヤ(プーリング層)
  • これまでのニューラルネットワークは、隣接する層と全てのニューロン間での結合(全結合/Affline)があった
    • 全結合のニューラルネットワークは、Afflineレイヤの後に活性化関数のReLUレイヤもしくはSigmoidレイヤが続き、最後にSoftmaxレイヤで最終的な出力を行う
    • CNNでは、[Convolution - ReLU - Pooling]というつながりになる
      • 出力するレイヤに近づくと[Affline - ReLU]という組み合わせが使われ、出力には[Affline - Softmax]が使われる

7.2

  • 畳み込み(Convolution)層の意義は、形状を維持して扱う
    • 画像認識の場合、入力データを3次元のデータとして受け取り、同じく3次元のデータとして次の層にデータを出力する(画像データを正しく理解出来る)
      • 畳み込み層の入出力データを、特徴マップとよび、畳み込み層の入力データを入力特徴マップ、出力データを出力特徴マップと呼ぶ
    • 全結合は画像認識の場合、全てのデータを形状(空間情報、RBGの各チャンネル間の関係性等)は無視して全ての入力データを同じ次元のニューロンとして扱う
  • 畳み込みそうで行うのは「畳み込み演算」
    • 画像処理でいうと、「フィルター演算」に相当する
      • 入力データに対してフィルターを適用する
      • 入力データとフィルターの要素を乗算し、その和を求める
        • CNNでは全結合のバイアスと対応するパラメータとして重みがある
  • 畳み込み層の処理を行う前に入力データの周囲に固定のデータ(0など)を埋めることをパディングと呼ぶ
    • パディングを使う理由は、出力サイズを調整するため
  • フィルターを適用する位置の感覚をストライドと呼ぶ
  • 3次元データの畳み込み演算での注意点は、入力データとフィルターのチャンネル数は同じ値にすること
  • 3次元の畳み込み演算はデータやフィルターを直方体のブロックで考えると判りやすい

7.3

  • プーリングは、縦・横方向の空間を小さくする演算
    • Maxプーリングの手法では、ウィンドウの中で最も大きい要素を出力する
  • プーリングの層の特徴は、以下のもの
    • 学習するパラメータがない
      • 対象領域から最大値をとる(もしくは平均とる)だけの処理
    • チャンネル数は変化しない
      • チェンネルごとに独立して演算を行う
    • 微小な位置変化に対してロバスト
      • 入力データの小さなズレは、吸収する

7.4

  • CNNでは4次元のデータを演算するが、im2colを使うと簡単に扱える
    • im2colでは、フィルター(重み)に取って都合のよい入力データを展開する関数(入力データに対してフィルターを適用する場所の領域を横方向に1列に展開する)
    • im2colでは、演算に多くのメモリを使用するが、大きな行列演算が可能
  • im2colでは、フィルターサイズ、ストライド、パディングを考慮して、入力データを2次元配列に展開する
  • プーリング層の実装は次の3段階の流れで行う
    • 入力データを展開する
    • 行ごとに最大値を求める
    • 適切な出力サイズに整形する

7.5

※コード解説のため省略

7.6

  • CNNでどのようなことを行っているのか
    • 一層目では、エッジ(色が変化する境目)やブロブ(局所的に塊のある領域)などをみている
    • 上記の情報を後続の層に渡している
  • 最初は抽象的な情報の認識なるが、層が深くなると高度な情報な認識を行う

7.7

  • 代表的なCNNの例として、LeNet、AlexNetについて触れる
    • LeNetは1989年に提案され、CNNの元祖になる
      • 現在のCNNとの違いは、活性化関数にある(LeNetはSigmoid関数、現在はReLU関数)
      • LeNetでは、サブサンプリングによって中間データのサイズ縮小を行うが、現z内はMax プーリングが主流
    • AlexNetはディープラーニングブームの火付け役
      • 活性化関数はReLU
      • LRNという局所的正規化を行う
      • Dropoutを使用する
  • ニューラルネットワークとしての変化はないが、取り巻く環境やコンピューター技術には大きな進歩があった(大量の並列計算を得意とするGPUの普及)

次は最後の8章になります。

ゼロから始めるディープラーニング 6章

タダです。

今回は6章の学習に関するテクニックについての勉強まとめです。

※記事は理解ができるたびに何度もアップデートしていこうと思います。 www.oreilly.co.jp

目次

なお、各章の内容は次の通りです。

6.1

  • 過学習にならないように最適な重みパラメーターの探索方法、初期値の設定について学ぶ
  • ニューラルネットワークの学習の目的は、損失関数の値をできるだけ小さくするパラメータを見つけること
  • 最適なパラメーターを見つける方法に勾配を使っていた
  • SGDのメリット・デメリット
    • SGDは単純で実装も簡単
    • SGDのデメリットは、関数の形状が等方的ではないと非効率的な経路で探索することになる
  • SGDの欠点の代替手法として、Momentum、AdaGrad、Adamという3つの手法がある
  • Momentumのイメージは、ボールが地面の傾斜を転がるように動く(物理法則に準じる動きをする)
  • AdaGradは、パラメータ全体の学習係数を適応的な値を調整して学習を行う
    • オーダーメイドの値をこしらえる
    • 過去の勾配を2乗和として記録する
  • AdamはMomentumとAdaGradを融合したもの
    • 加えてバイアス補正を行う
  • SGD、Momentum、AdaGrad、Adamはいずれも優れた手法ではない
    • 適材適所で使い分ける

6.2

  • 重みの初期値がニューラルネットワークの学習で重要になる
  • ReLU関数を使う場合は「Heの初期値」、sigmoid関数やtanhなどのS字カーブの時は「Xavierの初期値」を使うのがベストプラクティス

6.3

  • 重みの初期値を適切に設定すれば、各層のアクティベーションの分布は適度広がりを持ち、学習がスムーズに行える
  • Batch Normlization(Batch Norm)は2015年に提案された手法
    • であるが、多くの研究者や技術者に使われている
    • Batch Normのメリットは学習係数を大きくすることができる、初期値にそれほど依存しない、過学習を抑制することがあげられる
  • Batch Normは学習を行う際のミニバッチを単位として、ミニバッチごとに正規化する
  • Batch Normを使えば学習の進行を促進し、重みの初期値にロバストになる

6.4

  • 機械学習で目指すことは、汎化性能
    • 過学習で特定の問題しか解けないようなものではなくて汎用的に問題を解けるモデルの生成を行う
  • 過学習が起きる原因として主に2つある
    • パラメータを大量にもち、表現んりょくの高いモデルであること
    • 訓練データが少ないこと
  • 過学習抑制のために用いる手法がWeight decay(荷重減衰)
    • 大きな重みを持つことに対してペナルティを与えることで過学習を抑制する(L2ノルムを加算する)
  • Weight decayで対応できない場合に、Dropoutと言う手法がよく使われる

6.5

  • ニューラルネットワークでは重みやバイアスとは別にハイパーパラメータが多く登場する
    • Weight decay、学習係数など
  • ハイパーパラメタは適切な値に設定しなければ性能の悪いモデルになる
  • ハイパーパラメータの範囲は、大まかに指定するのが有効
  • ハイパーパラメータの最適化での注意点は、ディープラーニングの学習には多くの時間が必要であるため、適切な値に設定できなさそうな時はその値を切り捨てる
    • ステップ0:ハイパーパラメータの範囲を設定する(ざっくり)
    • ステップ1:設定されたハイパーパラメータの範囲からランダムにサンプリングする
    • ステップ2:ステップ1でサンプリングされたハイパーパラメータの値を使用して学習を行い、検証データで認識精度を評価する(ただし、エポックは小さく設定)
    • ステップ3:ステップ1と2をある回数(100回とか)繰り返し、認識の結果からハイパーパラメータの範囲を狭める

次は7章になります。