機械学習技術 人工知能技術 デジタルトランスフォーメーション技術. センサーデータ&IOT ICT技術 ストリームデータの処理と機械学習 ICTインフラ技術 Clojure Python 本ブログのナビ
機械学習における並列分散処理
機械学習の学習処理は、大量のデータを扱うため、高速で並列分散処理が必要とされている。並列分散処理は、複数のコンピューターで処理を分散し、同時に複数の処理を行うことで、高速で処理を行うことができまる。
並列分散処理には、以下のような技術が利用されている。
- MapReduce:Googleが開発した分散処理フレームワークで、大規模なデータセットを複数のサーバーに分割し、それぞれで処理を行い、最後に結果をまとめる方式となる。
- Spark:Apacheが提供する分散処理フレームワークで、MapReduceに比べて高速な処理が可能な技術となる。データをメモリ上に保持することで、ディスクI/Oを減らすことができる。
- TensorFlow:Googleが開発したオープンソースの機械学習フレームワークで、分散処理に対応している。データを分割し、複数のGPUや複数のマシンで同時に処理を行うことができる。
- Horovod:Uberが開発した分散深層学習フレームワークで、TensorFlowやPyTorchなどのフレームワークに対応している。複数のGPUや複数のマシンでの学習処理を高速に実行することができる。
これらの並列分散処理技術は、大量のデータを扱う機械学習の学習処理において、高速で効率的な処理を実現するために必要な技術となる。
本ブログでは以下にこれらの並列分散処理に関して具体的な実装を提示する。
実装
機械学習における並列分散処理は、データや計算を複数の処理ユニット(CPU、GPU、コンピュータクラスタなど)に分散し、同時に処理することで処理時間の短縮やスケーラビリティの向上を実現するもので、大規模なデータセットや複雑なモデルを処理する際に重要な役割を果たすものとなる。ここではこの機械学習における並列分散処理に対して、オンプレ/クラウド環境での具体的な実装例について述べている。
Federated Learning(フェデレーテッド ラーニング)は、機械学習モデルを訓練する新しいアプローチであり、データが分散している環境でのプライバシー保護や効率的なモデルトレーニングに対する課題に対処するための手法となる。従来の中央集権的なモデルトレーニングとは異なり、Federated Learningはデバイスやクライアント自体でモデルのトレーニングを行い、中央のサーバにモデルを送信することなく分散学習を行う仕組みとなる。ここでは、このFederated Learningの概要と各種アルゴリズム及び実装例について述べている。
ミニバッチ学習は、機械学習において広く使用される効率的な学習手法の一つであり、通常の勾配降下法(Gradient Descent)に比べて、計算効率が高く、大規模なデータセットに対しても適用可能なものとなる。ここでは、ミニバッチ学習の概要について述べる。ミニバッチ学習は、データセット全体を一度に処理するのではなく、サンプルを複数個(ミニバッチと呼ばれる)にまとめて一括で処理する学習方法で、各ミニバッチごとに損失関数の勾配を計算し、その勾配を使用してパラメータを更新するものとなる。
技術トピックス
オンライン学習を用いることで、学習データの個数がとても大きい場合でも効率的に識別器を学習することが可能となる。さらに大規模なデータをより短い時間で学習するには、並列計算や分散環境を用いることで実現できる。
今回は、より大量のデータに適した方法で、回帰や分類のの分析を適用していくことについて述べる。今回扱うのは、10万レコードという比較的控えめなデータセットとなる。これはビッグデータではないが(100MBで、1台のマシンのメモリに快適に収まる)、大規模データ処理の一般的な手法を示すには十分な大きさとなる。この章では、Hadoop(分散計算のための一般的なフレームワーク)をケーススタディとして、並列処理によってアルゴリズムを非常に大きなデータ量に拡張する方法に焦点を当て述べる。
Hadoopの特徴は、HDFS(Hadoop Distributed File System)と呼ばれる分散ファイル制御モジュールとMapReduceと呼ばれる分散データ処理基盤を特徴として持つ。ここではClojureが提供するHadoopと連携する2つのライブラリ、TesserとParkourを取り上げ、MapReduceの仕組みについて具体的な実装を元に述べる。
バッチ型勾配降下の各反復処理にかかる時間の長さは、データのサイズとコンピュータのプロセッサの数によって決まる。いくつかのデータの塊を並列に処理するとはいえ、データセットは大きく、プロセッサは有限である。計算を並列に行うことで高速化を実現するが、データセットのサイズが2倍になれば、実行時間も2倍になる。
Hadoopは、1台のマシンの能力を超える作業を並列化することを目的とした、過去10年間に登場したいくつかのシステムのうちの1つとなる。Hadoopは、複数のプロセッサでコードを実行するのではなく、多くのサーバーで計算を実行することを目的としている。実際、Hadoopのクラスターは何千台ものサーバーで構成されることもある。
“Clojureを用いたシンプルな推薦アルゴリズムの実装(2)”で述べた全項目のペアワイズド・ディファレンスはコンパイルすることに時間のかかる作業となる。アイテムベースの推薦技術の利点のひとつは、項目間の一対の差分が時間の経過とともに比較的安定することである。差分行列は定期的に計算されればよい。これは、これまで見てきたように10個のアイテムを評価したユーザが、さらに1個のアイテムを評価した場合、そのユーザが評価した11個のアイテムの差分を調整するだけでよいこととなる。
しかし、アイテムベースレコメンダーの実行時間は、保存するアイテムの数によって変化し、アイテム数に比例して実行時間が長くなる。
ユーザ数がアイテム数に比べて少ない場合、ユーザベースのレコメンダーを実装する方が効率的な場合がある。例えば、コンテンツアグリゲーションサイトでは、アイテム数がユーザー数を桁違いに上回る可能性があり、ユーザーベース・レコメンダーの良い候補になる。
“ClojureとMahoutを用いたラージスケールのクラスタリング“で述べたMahoutライブラリには、ユーザーベースレコメンダーを含む様々なレコメンダーを作成するためのツールが含まれている。今回はこれらについて述べてみる。
Apache Sparkは、オープンソースの並列分散処理基盤となる。Sparkは複数のコンポーネントで構成されている。並列分散処理のエンジンであるSpark Coreをベースに、用途別のライブラリ群として、SQL処理用のSpark SQL、ストリーム処理用のSpark Streaming、機械学習処理用のMLlib、グラフ処理用のGraphXなどとなる。
Spark CoreのデータソースにはHDFS(Hadoop Distributed File System)だけでなく、HIve、HBase、PostgreSQL、MySQL、CSVファイルなどの入力を受け付けることができる。
Sparkは大量データに対し高速な並列分散処理を実現する。Sparkはデータソースからデータを読み出した後、ストレージへのI?OやネットワークI/Oが極力少なくなる様に処理する。このため、Sparkは同じデータに対する変換処理が連続するケースや、機械学習のように結果セットに対して複数回繰り返し処理を行う処理に適している。また、同じレイテンシーで動作することを利用してストリーム処理を行うこともできる。Sparkの特徴を述べるために「機械学習処理」「業務処理」、「ストリーム処理」の観点でそれぞれ以下に述べる。
Apache Sparkのデータ処理には「RDD(Resillient Distributed Dataset)」と呼ばれるデータ構造を利用する。Sparkのプログミングモデルは「RDDを加工して新たなRDDを生成し、これを繰り返すことで目的の結果を得る」というものになる。
ここではこの動作の仕組みを詳しく見て、RDDの構造や特徴、およびRDDを中心とした分散構造がクラスタ上でどのように行われるかについて述べる。まずはRDDの構造や特徴、RDDに適用できる処理について述べる。
今回はSparkを動作させる環境の整備について述べる。Sparkはクラスタ上での動作を前提としている。しかし作成中のアプリケーションの挙動を確認したい場合や、機能テストを行いたい場合はクラスタ環境を構築するのは大掛かりで面倒であるので、単一のマシン上でのsparkを動作さらることも可能となっている。今回はまず単一マシン上での環境構築について述べ、さらにクラスタ環境を構築する手順について述べる。
今回はApache Sparkの開発環境の構築方法、アプリケーションのビルド法および実行方法について述べる。SparkではRDDを直接操作する最も基本的なライブラリのほか、いろいろな用途に特化したエコシステムの各種ライブラリが同梱されており、さまざまなプログラミング言語むけのAPIが提供されている。今回はApache Sparkが記述されているScalaを用いたアプリケーションの構築について、Spark-clintを利用する前提で述べる。まず、Sparkアプリケーションは、ソースコードをコンパイルしてJARファイルにパッケージングする必要がある。今回はこのためにsbtを用いる。sbtはScalaやJavaで記述されたソースコードのコンパイルやライブラリの依存関係の管理、パッケージングなど、アプリケーション開発プロジェクトにおけるビルドプロセスを統合的に管理するためのツールとなる。
Sparkプロジェクトは、低レイテンシーでのジョブ実行を重視したクラスタコンピューティングのフレームワークで、2009年にUC BerkleyのAMP Labから生まれた比較的新しいプロジェクトとなる。SparkはHadoopと共存可能だが(Hadoop Distributed File System(HDFS)に格納されたファイルに接続するなど)、計算の多くをメモリ上に保持することでジョブ実行時間の大幅な高速化を目指している。
今回はClojureライブラリであるSparklingを使ってSparkジョブを実行するために必要なキーコンセプトについて説明する。
GraphXは、Sparkと連携して動作するように設計された分散グラフ処理ライブラリとなる。 “Apache SparkとMLlibによる大規模な機械学習“で述べたしたMLlibライブラリのように、GraphXはSparkのRDDの上に構築された一連の抽象化機能を提供する。グラフの頂点と辺をRDDとして表現することで、GraphXは非常に大きなグラフをスケーラブルに処理することができる。
グラフ並列システムは、表現できる計算の種類を制限し、グラフを分割・分散する技術を導入することで、高度なグラフアルゴリズムを一般的なデータ並列システムより数桁速く効率的に実行することが可能となる。
並列計算と確率的最適化は比較的相性がよく、これまで述べてきた方法を修正することで並列計算が可能となる。ここでは、さまざまな並列計算が可能となる。ここでは、さまざまな状況に対応す手法を列挙する。各種手法の概要は以下のようになる。単純平均、ミニバッチ法、非同期型分散SGD、確率的勾配降下法、分散環境での確率的最適化
連合学習は: – 大きな計算能力・記憶能力をもつ1台のサーバと – データ収集能力とそこそこの計算資源をもつ多数のクライアントが– 狭い帯域の回線を使って通信しながら 協力して効率的に学習をする枠組み
コメント
[…] 削減し、より軽量なモデルを使用することができる。また、モデルの並列化やGPUの活用なども計算コストを低減する手法となる。”機械学習における並列分散処理“も参照のこと。 […]
[…] エーションを使用することができる。さらに、並列計算や分散計算を利用することで効率を向上させることが可能となる。詳細は”機械学習における並列分散処理“も参照のこと。 […]
[…] を導入して計算を最適化することができる。また、並列処理やGPUを使用することで、効率を向上させることも考えられる。詳細は”機械学習における並列分散処理“も参照のこと。 […]
[…] 散処理: 分散処理フレームワーク(例:Apache Spark)を使用して、計算を並列化することで、大規模なグラフに対応できる。詳細は”機械学習における並列分散処理“を参照のこと。 […]