言語処理学会第20回年次大会	  (NLP2014)	

RaSC:	  高速なストリーム通信をサポートする	  言語処理プログラムの	  高速化・高並列化ミドルウェア	

田仲正弘*1	
，大竹 清敬	  *1		  	  ,	  鳥澤 健太郎	  *1		  	  ,	  田浦 健次朗	  *2	（独）情報通信研究機構 情報分析研究室	  *1	東京大学 情報理工学系研究科	   *2		

背景	
•
•

近年，大規模テキスト分析が注目	  	  NICTでの取り組み:	  大規模Web情報分析システムWISDOM	  X,	  対災害情	  	  報分析システム	 	  	  	  	  	  	  	  	  Q.	  地球温暖化の影響は？		  	  	  Q.	  脱原発は	  	  A.	  感	  染症、	  何をもたらす？		  	  食糧危機		  	  	  	  A.	  国家崩壊、	  	  	  スタグフレーション		  	  	  質問応答	  		  2000万文書/dayを解析	  	  40億文書を収納見込み		  	連携利用	  Web大規模アーカイブ	   構文解析	  	  悪評の高い食品は？		  	  ダイエット用の◯◯◯		  	  	  	  	  	  意見・発信者分析		  	  	  森林破壊が進行すると？		  	  地球温暖化⇒海水温上昇⇒	  大腸菌増加⇒食中毒増加		  	  	  	  	  未来分析 	  	同義性認識

因果関係データ
矛盾データ

大規模Web情報分析システムWISDOM	  X	

2	

動機	
•

分析には計算負荷の高い言語処理プログラムを組み合わせ	  à	  多数の計算機上での高速・高並列な処理が必要	
初期解析クラスタ	  応用解析クラスタ	  Webノード1台に置けない大規模データを利用	  2000万文書/day	  計算ノード140台による分析	  計2200並列，	  2万プロセス以上	

計40並列，40TBの	  データを用いて分析	  各種言語処理	  プログラム	  分析アルゴリズム研究者	  WISDOM	  Xにおける解析の分散実行	

情報分析
アプリケーション
3	

課題	
•

多くの言語処理プログラムは，蓄積されたデータを一括処理するバッチ型 à	  定常的に流入するデータの処理は想定せず	  • 単純に並列実行を増やしても速度が向上しない	
起動のオーバヘッド	  文書ごとに巨大ファイルを逐一ロード	  する必要があり待ち時間が発生	  Web文書	
（常に流入）	  HTMLからの	  文抽出	  係受解析	

データ通信に伴うCPUアイドル時間	  前段の処理が終わるまで	  後段の処理で待ち時間発生	  未来分析	
分散処理の実装コスト	  解析プログラムの特徴ごと	  に適した実装が必要	  事実型質問応答	  （高並列）	

計2200並列	  2基のクラスタ上で稼働	
4	

課題(1)	  	  データ通信に伴うCPUアイドル時間	  ディスク上のファイルを	  介して入出力	  HTMLからの	  文抽出	  係り受け解析	

因果関係	  抽出	

前段の処理が完了してから実行開始	

サーバ	

受信	
ノンブロッキング呼出	

送信	

実行	

受信	

送信	

ブロッキング呼出	

クライアント	サーバ	

受信	 実行	 送信	

受信	

クライアント	

送信	

参考	5	

課題(2)	   起動オーバヘッド	
断続的な入力データの到着ごとに起動す
るとオーバヘッド大	  起動時にディスクから読込	  ・内部データ構造構築	

ライブラリ群	

辞書データ，モデル	  （約400MB）	

辞書データ，モデル	  （約750MB）	

実行時コンパイル	

ロード	

ロード	

文書構造	  解析	  係受解析	

因果関係	  抽出	

• 辞書データ・モデルのロードに数秒程度要する場合あり	  • バッファリングでは解決できず（後段の解析プログラムでデータ受信待ちによるアイドル時間発生）	  6	

課題(3)	  	  並列処理実装コスト	
••

複数の計算機ノード上の処理結果を段階的に収集，集約	  言語処理プログラムごとの個別の実装ではコスト大	
通常の並列ストリーミング処理のコード例	  （一部．全体で約400行以上）	

••断続的に到着する複数のストリーミングデータの管理，処理の同期，エラー処理等が実装コスト大	  適切なライブラリなし	

ストリーミングサーバ呼び出し	…	  for	  (String	  endpoint	  :	  list)	  {	  	  	  exec.execute(new	  Runnable()	  {	  	  	  	  	  	  public	  void	  run()	  {	  	  	  	  	  	  	  	  	  try	  {	  	  	  	  	  	  	  	  	  	  	  s	  =	  new	  ClientFactory().create(clsService,	  new	  URL(url));	  	  	  	  	  	  	  	  	  	  	  	  if	  (s	  instanceof	  ArrayResultNoYﬁer)	  {	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  s.setReceiver(new	  ArrayResultReceiver()	  {	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  public	  void	  receive(Object	  result)	  {	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  queResult.add((V)	  result);	  …	  7	

解決:	  高速化・高並列化ミドルウェアRaSC	
言語処理プログラムを共通ミドルウェア上で接続，実行して高速化・高並列化	  • 特徴	  – 言語処理プログラムを共通の高速ストリーム通信で接続	  – 起動オーバヘッドを削減	  – 並列処理実装を簡単化	  （主にJavaで実装．約1万6000行）	  • 本年次大会に合わせてオープンソースで公開	  8	

RaSCの機能(1)	  言語処理プログラムのサーバ化	
• プログラムを計算機ノードに常駐させ起動
コスト削減	  • 言語処理プログラムとは標準入出力を介してやりとり	  • 多数の通信プロトコルに対応（MessagePack	  RPC,	  JSON	  RPC,	  ProtocolBuﬀers,	  SOAP），様々な言語から呼び出し可	  • 複数の実行プロセスを管理，ユーザが意識することなく並列化	  プログラムごとに開発	  （コード規模:	  数行～十数行）	  クライアント	  共通プロトコル	   RaSC	  ストリーミング化インタフェース	
入出力アダプタ	 プロセス管理	プログラム	サーバ構成	  Javaプログラムからの使用例	  (初期化含め2ステートメント)	
TextAnalysisService	  client	  =	  	  factory.create(DependencyAnalysis.class,	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  new	  InetSocketAddress(”HOST_ADDRESS",	  PORT));	  String	  result	  =	  client.analyze(“解析対象文”);	  9	

言語解析プログラムのサーバ化 適用事例	
Webページ1件の解析ごとに	  起動する場合と比較	  大規模Web情報分析システムWISDOM	  Xへの適用事例	
記述コード量	

速度向上	

文書構造解析	  （NICT開発，Perl）	

12行	

2.8倍	

構文解析	  （J.DepP，C++）	

3行	

3.6倍	

因果関係抽出	  （NICT開発，Perl）	

6行	

126倍	

（新プログラム）	

（数行～十数行）	

…	

適用例	

言語処理プログラムごとに開発．	  
小規模・定型的であり実装用意	  起動時の巨大	  ファイルロード	  の削減が寄与	  10	

RaSCの機能（2） 大規模分析の並列分散化	
• ストリーミング通信によるプログラムの並列分散機構を用意	  – 基本的な並列分散化なら新たな実装不要	  – プラグインで機能拡張	  • 並列分散の実行，結果の集約の実装コストを削減	  クライアント	  RaSC	  ストリーミング化インタフェース	
集約プラグイン	   集約プラグイン	  （SVMランキング）	 （重複除去）	

分散・集約機構	
未来分析	  サーバ	

質問応答	  サーバ	

クラスタA（メモリ豊富）	
クラスタB（ディスク高速）	
11	

大規模分析の並列分散化 適用事例	
大規模Web情報分析システムWISDOM	  Xへの適用事例	
適用例	
事実型質問応答	
係り受けデータ検索	

コード量	
71行	
44行	

管理データ	
16TB	7.5TB	

全文検索	
（新プログラム）	

60行	
（数行～数十行）	

3.7TB	
…	

いずれも40台の計算機上	  で並列して検索	

計算機ノード1台に	  収まらないデータを分散	大規模分析の並列分散化
利用事例	 適用事例	
• 事実型質問応答を初めとする各種分析の実現に寄与	  – バックエンドでの分散検索に利用	  – 多種の解析結果データの分散検索を短期間で開発	  大規模Web情報分析システムWISDOM	  Xへの適用事例	
適用例	
事実型質問応答	
係り受けデータ検索	

コード量	
71行	
44行	

管理データ	
16TB	7.5TB	

全文検索	（新プログラム）	

60行	
（数行～数十行）	

3.7TB	
…	

いずれも40台の計算機上	  で並列して検索	

計算機ノード1台に	  収まらないデータを分散	

大規模Web情報分析システムWISDOM	  X（事実型質問応答）	

大規模分析の並列分散化
利用事例	 適用事例	
• 事実型質問応答を初めとする各種分析の実現に寄与	  – バックエンドでの分散検索に利用	  – 多種の解析結果データの分散検索を短期間で開発	  大規模Web情報分析システムWISDOM	  Xへの適用事例	
適用例	
事実型質問応答	
係り受けデータ検索	

コード量	
71行	
44行	

管理データ	
16TB	7.5TB	

全文検索	（新プログラム）	

60行	
（数行～数十行）	

3.7TB	
…	

いずれも40台の計算機上	  で並列して検索	

計算機ノード1台に	  収まらないデータを分散	

大規模Web情報分析システムWISDOM	  X（Why型質問応答[1]）	
[1]	  Jong-­‐Hoon	  Oh,	  et	  al.	  Why-­‐QuesYon	  Answering	  using	  Intra-­‐	  and	  Inter-­‐SentenYal	  Causal	  RelaYons,	  In	  Proceedings	  of	  the	  ACL	  2013,	  pp.	  1733—1743,	  2013.	

大規模分析の並列分散化
利用事例	 適用事例	
• 事実型質問応答を初めとする各種分析の実現に寄与	  – バックエンドでの分散検索に利用	  – 多種の解析結果データの分散検索を短期間で開発	  大規模Web情報分析システムWISDOM	  Xへの適用事例	
適用例	
事実型質問応答	
係り受けデータ検索	

コード量	
71行	
44行	

全文検索	
60行	
分析結果の例:	  	  （新プログラム）	
（数行～数十行）	
森林破壊が続く à	  地球温暖化が進行する	  	  à	  海水温度が下がる	  à	  腸炎ビブリオが増える	  	  à	  食中毒が増える	
いずれも40台の計算機上	  で並列して検索	

管理データ	
16TB	7.5TB	
3.7TB	
…	
計算機ノード1台に	  収まらないデータを分散	

大規模Web情報分析システムWISDOM	  X（未来分析[2]）	
[2]	  Chikara	  Hashimoto,	  et	  al.	  ExtracYng	  Event	  Causality	  ExploiYng	  SemanYc	  RelaYon,	  Context,	  and	  AssociaYon	  Features,	  In	  Proceedings	  of	  the	  ACL	  2014	  (to	  appear)	

大規模分析の並列分散化
利用事例	 適用事例	
• 災害時におけるTwiqerの分析にも応用	  • ストリームとして到着するTweetの処理を高速化	  大規模Web情報分析システムWISDOM	  Xへの適用事例	
適用例	
事実型質問応答	
質問例：「宮城県のどこで係り受けデータ検炊き出しをしていますか」	  索	全文検索	（新プログラム）	

コード量	
管理データ	
71行	16TB	
質問例：「宮城県で何が不足し44行	7.5TB	ていますか」	  60行	
（数行～数十行）	

いずれも40台の計算機上	  で並列して検索	
被災状況の概観を提示	  3.7TB	
…	
計算機ノード1台に	  収まらないデータを分散	NICT	  対災害情報分析システム	既存フレームワークとの比較	
••

各種の言語処理プログラムの高速実行にフォーカス	  計算機200台超での稼働，十数種の言語処理プログラムの連携に実績	  既存プログラムの実行	

大規模	  並列処理	  

簡便さ	

ストリーミ
ング処理	Hadoop	  	  (大規模バッチ処理)	

△	◎	

◎	×	Storm	  	  (大規模ストリーム処理)	

△	

◎	

◎	

◎	Jubatus	  (分散オンライン機械学習)	

△	○	

◎	

◎	UIMA	  	  (NLPツール連携)	

○	△	

△	

×	RaSC	◎	○	○	

○	17	

オープンソースでの公開	
•URL:	  hqp://alaginrc.nict.go.jp/rasc/	  – 高度言語情報融合フォーラム（ALAGINフォーラム） àオープンソース à	  オープンソー
スソフトウェア からアクセス可能	  •チュートリアル，著名な言語処理プログラム・機械学習プログラムでの利用方法を掲載	  • ソースコードはGitHubで公開	  18	

使用例	
••
•

既存の言語処理プログラムを簡便に並列実行	  
パイプによる入出力で他のプログラムと接続可能	  複数件の入力を，並列実行されるプロセスに割り振り	  # 言語処理プログラムを直接実行した場合$ time cat INPUT_TXT | juman | knp > OUTPUT_TXT
real 2m24.652s
前もってプロセスを複数起動	  user 0m0.901s（この例では8並列に設定済）	  sys 0m0.167s# KNPを使うRaSCサーバを起動
ホスト・ポートを変更すれば	  $ ./server.sh KNPService 19999 start
KNPService started on port 19999
他の計算機ノードへもアクセス	  # RaSC上でJUMAN, KNPを実行$ cat INPUT_TXT | java -cp ./lib/*: RaSCClient localhost 19999 > OUTPUT_TXT
real 0m29.593s # マルチコアCPUにより並列化（Intel Xeon X5675*2 ）user 0m0.556s
sys 0m0.055s	

RaSCドキュメント チュートリアル「マルチコアCPUを生かして並列実行する」より	

•ALAGINフォーラム等での講習会を予定	  19	

使用例	••

ユーザ視点からは並列化を意識せずに実行	  入力の順序は出力でも保存	  前ページ RaSCClient のメイン部分（全体は約30行．RaSCのWebサイト参照 ）	

…	  br	  =	  new	  BuﬀeredReader(new	  InputStreamReader(System.in));	  	  List<String>	  list	  =	  new	  ArrayList<>();	  	  String	  str;	  	  while((str	  =	  br.readLine())	  !=	  null)	  {	  	  	  	  list.add(str);	  	  	  	  	  if	  (list.size()	  <	  1000)	  conJnue;	  	  	  	  String[]	  ret	  =	  client.analyzeArray(list.toArray(new	  String[0]));	  	  	  	  	  System.out.println(StringUYls.join(ret,	  "\n"));	  	  	  	  	  list.clear();	  ネットワーク経由呼び出しのオーバヘッド	  }軽減のため，ある程度一括して処理可能	  …	  20	

まとめ	•

大規模テキスト分析には，計算負荷の高い言語処理プログラムを多数の計算機上での高速・高並列な処理が必要	  •課題	  – データ通信に伴うCPUアイドル時間	  – 言語処理プログラムの起動オーバヘッド	  – 並列処理の実装コスト	  •解決:	  高速・高並列化ミドルウェアRaSC	  – プログラム間をストリーミング通信で接続可能に	  – プログラムの実行プロセスを計算機ノードに常駐させ起動コスト削減	  – 並列分散処理を簡単化する機構を提供	  •オープンソースで公開中！	  
21