中田 秀基(AIST/Titech), 田中 良夫(AIST) 松岡 聡(Titech/JST), 関口 智嗣(AIST) Oct. 26, 2001 at Wakayama Grid RPCシステムのAPIの提案 中田 秀基(AIST/Titech), 田中 良夫(AIST) 松岡 聡(Titech/JST), 関口 智嗣(AIST) Advanced Industrial Science and Technology / Tokyo Institute of Technology
背景 - The Grid 管理体制の異なる複数のサイトに存在する資源を使用して、高性能計算を行う ツールキットが整備されつつある セキュリティ、不安定性、ヘテロ性 ツールキットが整備されつつある Globus, Global Grid Forum それでもGrid上に計算システムを構築することはなかなかに難しい Advanced Industrial Science and Technology / Tokyo Institute of Technology
GridRPCシステム 使用が容易なGridシステム 問題点: APIの標準が存在しない ー> 標準APIを提案 Ninf,NetSolve, etc. 複数のシステムが存在 さまざまな領域で使用されつつある 問題点: APIの標準が存在しない 標準APIを策定することにより、 GridRPC システムの普及 より洗練された実装の出現 が期待できる ー> 標準APIを提案 Advanced Industrial Science and Technology / Tokyo Institute of Technology
発表の概要 GridRPCシステムの概要 既存のシステム API 提案する GridRPC API 方針 API関数 サンプルコード Advanced Industrial Science and Technology / Tokyo Institute of Technology
Grid RPC 科学計算向けの使用が容易なGridシステム シンプルな RPC API Fortran / C で記述されたレガシーライブラリ ファイルインターフェイスのアプリケーション double A[n][n],B[n][n],C[n][n]; /* Data Decl.*/ dmmul(n,A,B,C); /* Call local function*/ Ninf_call(“dmmul”,n,A,B,C); /* Call server side routine*/ Grid RPC is a Easy to use grid system fo rscientific computing It has very simple RPC API This code segment demonstrate the simplisity this line is calling matrix multiply as a local function To make it RPC, only you have to do is just rewrite this line into this. It so easy. Now, The arguments automatically shipped to the server and the caliculation is done on the server side , results come back and are automatically stored in the arguments For the RPC component, existing libs and applications can be used It is also very easy to make libs and apps into RPC component. Advanced Industrial Science and Technology / Tokyo Institute of Technology
GridRPC Server Client サーバが計算資源とプログラムを提供 クライアントからデータを提供、結果を回収 Data Network enabled server may be the simplest form of global computing A Server serves computation, namely computation resource and computation program A Client ask for a server to do the computation, and send data for computation. Server will do some computation and returns the result. There are already several implementations of network enabled server. Such as our ninf, netsolve from utk, RCS from ETH, Switzerland . Data Server Client Result Advanced Industrial Science and Technology / Tokyo Institute of Technology
GridRPC アプリケーションとGridの間を埋めるミドルウェア より複雑なGrid対応システムの基盤 アプリケーション パラメータスイープ モンテカルロシミュレーション GA 逐次半正定値計画緩和法 Network enabled servesr may seem to be too primitive. But, it can serve as bases for more complex form of global computing such as parameter sweeping or mote carlo simulation Another important role of the NES is the middleware between the grid and application. Recently, some software for grid infrastructure are proposed, such as Legion and Globus. However, sometimes to implement application directly on top of such grid infrastructure is too hard for application people. NES can serve more friendly API for application people. Application Network Enabled Server Lower-level Grid Systems Advanced Industrial Science and Technology / Tokyo Institute of Technology
既存のGrid RPCシステム Ninf (AIST ・ Titech) NetSolve (UTK) Since1995 プロキシ(MetaServer)による負荷分散 IDL記述が比較的容易 ファイルのステージング サーバ側ルーチンからクライアント上の関数を呼び出すコールバック farmingのためのグループAPI NetSolve (UTK) Since 1995? Agentによる負荷分散 Matlab,Mathematica インターフェイス クライアントからサブルーチンを送り込む User Supplied Function FarmingAPI Advanced Industrial Science and Technology / Tokyo Institute of Technology
Ninf クライアントAPI API関数名 機能 int Ninf_call(char *, ...) ブロッキングRPC 第1引数でRPCライブラリ名を指定する 返り値は 成功時には NINF_OK、失敗時にはNINF_ERROR int Ninf_call_async(char *, ...) ノンブロッキングRPC 第1引数でRPCライブラリ名を指定する 返り値は 成功時には正の整数値であるセッションID 失敗時にはNINF_ERROR int Ninf_session_probe(int) 特定のノンブロッキングRPCが実行中かどうかの検出 引数はセッションID 返り値は真偽値を示すint int Ninf_session_cancel(int) 特定のノンブロッキングRPCの実行中止 引数はセッションID 返り値は成功時にはTRUE、失敗時にはFALSE int Ninf_wait(int) 特定のノンブロッキングRPCの終了を待つ 引数はセッションID 返り値は 成功時には NINF_OK、失敗時にはNINF_ERROR int Ninf_wait_all() 実行中のノンブロッキングRPCのすべての終了を待つ 返り値は 成功時には NINF_OK、失敗時にはNINF_ERROR int Ninf_wait_any(int *) 実行中のノンブロッキングRPCのいずれかの終了を待つ 第1引数のポインタに終了したセッションのIDを返す 返り値は 成功時には NINF_OK、失敗時にはNINF_ERROR Advanced Industrial Science and Technology / Tokyo Institute of Technology
Ninf サーバ側記述 プロトタイプ宣言にモードを追加したもの 任意のCコードを書くことも可能 Define dmmul( mode_in int n, mode_in double A[n][n], mode_in double B[n][n], mode_out double C[n][n]) Required "mmul.o" Calls "C" mmul(n,A,B,C); Advanced Industrial Science and Technology / Tokyo Institute of Technology
NetSolve クライアントAPI Ninfとほとんどセマンティクスは同じ Wait系が貧弱なのはfarming 専用APIがあるから 機能 int netsl(char *, ...) ブロッキングRPC 第1引数でRPCライブラリ名を指定する 返り値は ステイタスコード int netslnb(char *, ...) ノンブロッキングRPC 第1引数でRPCライブラリ名を指定する 返り値は 成功時には 正数であるのリクエストハンドル、失敗時にはエラーコードを返す int netslpr(int) 特定のノンブロッキングRPCが実行中かどうかの検出 返り値はNetSolveNotReadyまたは NetSolveOK int netslwt(int) 特定のノンブロッキングRPCの終了を待つ Ninfとほとんどセマンティクスは同じ Wait系が貧弱なのはfarming 専用APIがあるから Advanced Industrial Science and Technology / Tokyo Institute of Technology
NetSolveサーバ側記述 記述はかなり面倒 基本的にCプログラムのテンプレートとなるので非常に柔軟 @PROBLEM linsol @INCLUDE <math.h> @LIB -L/home/lib/ @FUNCTION linsol @LANGUAGE FORTRAN @MAJOR COL @PATH LinearAlgebra/LinearSystems/ @DESCRIPTION Solves the square linear system A*X = B. Where: A is a double-precision matrix of dimension NxN B is a double-precision matrix of dimension NxNRHS X is the solution @INPUT 2 @OBJECT MATRIX D A Matrix A (NxN) @OBJECT MATRIX D B Matrix B (NxNRHS) @OUTPUT 1 @OBJECT MATRIX D X Solution X (NxNRHS) @COMPLEXITY 3,3 @CALLINGSEQUENCE @ARG I0 @ARG I1,O0 @ARG nI0,mI0,mI1 @ARG nI1 @ARG lI0 @ARG lI1,lO0 @CODE 記述はかなり面倒 基本的にCプログラムのテンプレートとなるので非常に柔軟 Advanced Industrial Science and Technology / Tokyo Institute of Technology
API 策定の方針 (1) 方針 APIの範囲 初期段階としてクライアントプログラムが共有できることを目指す コンパイルドライバ、サーバ側インターフェイス、などは定めない Advanced Industrial Science and Technology / Tokyo Institute of Technology
API 策定の方針 (2) 機能の選択 サーバ選択機能(負荷分散機能) コールバック、User Supplied Function は含めない 実装が困難で、需要が不明なため FarmingAPI,グループAPIは含めない 双方とも未成熟 基本機能APIで実現が可能 サーバ選択機能(負荷分散機能) GridRPC APIからは分離、別レイヤで実現 基本ブロックとしての使い勝手を重視 別レイヤでの実現を容易にするために関数ハンドラという概念を導入 Advanced Industrial Science and Technology / Tokyo Institute of Technology
API 策定の方針 (3) エラーコード、ステイタスコード プログラム中に直接現れるため定義する必要がある。 エラーコードのバリエーションはシステム依存 →なるべく一般的なコードを作成 システム依存の部分はコードに対応するメッセージで記述 Advanced Industrial Science and Technology / Tokyo Institute of Technology
GridRPC API (1) ステイタスコードとエラーコード 意味 GRPCERR_NOERROR エラーではない GRPCERR_NOT_INITIALIZED 初期化がされていない GRPCERR_SERVER_NOT_FOUND サーバが見つからない GRPCERR_CONNECTION_REFUSED サーバへの接続に失敗した GRPCERR_NO_SUCH_FUNCTION 指定した関数が存在しない GRPCERR_AUTHENTICATION_FAILED サーバでの認証に失敗した GRPCERR_RPC_REFUSED サーバで実行する権限がない GRPCERR_COMMUNICATION_FAILED 通信に障害が起きた GRPCERR_PROTOCOL_ERROR プロトコルがおかしい GRPCERR_CLIENT_INTERNAL_ERROR クライアントの内部エラー GRPCERR_SERVER_INTERNAL_ERROR サーバの内部エラー GRPCERR_EXECUTABLE_DIED 実行ファイルがなんらかの理由で落ちた GRPCERR_SIGNAL_CAUGHT 計算中になんらかのシグナルが発生した GRPCERR_UNKNOWN_ERROR 不明なエラーが発生した ステイタスコード コード 値 意味 GRPC_OK 0 成功を表す GRPC_ERROR -1 失敗を表す Advanced Industrial Science and Technology / Tokyo Institute of Technology
GridRPC API (2) 初期化と後処理 int grpc_finalize(); int grpc_initialize( char * config_file_name); コンフィギュレーションファイルを読み出して、 RPCシステムに必要な初期化を行う。 この関数が呼ばれるよりも前に、RPC用の関数を呼び出した場合には、正常な動作は保証されない。 引数としてコンフィグレーションファイルの名前を与える。コンフィグレーションファイルの機能は、各システムの構成に依存するので、ここでは規定しない。 初期化が成功すればGRPC_OK、失敗すればGRPC_ERRORを返す int grpc_finalize(); RPCに使用した資源を解放する。 この関数が呼ばれた以降にRPC用の関数を呼び出した場合には、正常な動作は保証されない。 Advanced Industrial Science and Technology / Tokyo Institute of Technology
GridRPC API (3) リモート関数ハンドル int grpc_function_handle_default( grpc_function_handle_t * handle, char * func_name); デフォルトのホスト、ポートを使用して、第1引数で与えられる構造体領域を初期化 初期化が成功すればGRPC_OK、失敗すればGRPC_ERROR int grpc_function_handle_init( grpc_function_handle_t * handle, char * host_name, int port, char * func_name); サーバのホストとポートを明示的に指定して初期化 grpc_function_handle_t * grpc_get_handle( int sessionId); 引数で指定したセッションIDが使用したハンドルのポインタを取得する。 Advanced Industrial Science and Technology / Tokyo Institute of Technology
GridRPC API (4) RPC呼び出し 第1引数で指定したハンドラを使用してブロッキングでRPC呼び出しを行う int grpc_call( grpc_function_handle_t *, ...); 第1引数で指定したハンドラを使用してブロッキングでRPC呼び出しを行う 成功すればGRPC_OK、失敗すればGRPC_ERROR int grpc_call_async( grpc_function_handle_t *, ...); 第1引数で指定したハンドラを使用してノンブロッキングでRPC呼び出しを行う 成功すればその呼び出しのハンドラとなる正数、セッションIDを、失敗すればGRPC_ERRORを返す Advanced Industrial Science and Technology / Tokyo Institute of Technology
GridRPC API (5) RPC呼び出し int grpc_probe(int sessionID); 第1引数で指定する呼び出しが終了したかどうかを調査 終了していれば1を、していなければ0を返す。調査自体に失敗すればGRPC_ERRORを返す int grpc_cancel(int sessionID); 実行中の関数をキャンセル 成功すればGRPC_OK、失敗すればGRPC_ERROR 関数がすでに終了していた場合にもGRPC_OK int grpc_wait(int sessionID); 第1引数で指定する呼び出しの終了を待つ Advanced Industrial Science and Technology / Tokyo Institute of Technology
GridRPC API (6) RPC呼び出し int grpc_wait_and( int * idArray, int length); 複数の呼び出しがすべて終了するのを待つ。第1、第2引数でセッションIDの配列とその長さを指定する。すべての呼び出しが成功すればGRPC_OK、いずれかが失敗すればGRPC_ERRORを返す。 int grpc_wait_or( int * idArray, int length, int * idPtr); 複数の呼び出しのいずれかが終了するのを待つ。 第1、第2引数でセッションIDの配列とその長さを指定する。 終了した呼び出しが成功していればGRPC_OK、失敗していればGRPC_ERRORを返す。第3引数に終了したセッションのIDをセットする。 int grpc_wait_all(); それまでに行ったノンブロッキング呼び出しがすべて終了するのを待つ。 すべての呼び出しが成功すればGRPC_OK、いずれかが失敗すればGRPC_ERRORを返す。 int grpc_wait_any( int * idPtr); 終了した呼び出しが成功していればGRPC_OK、失敗していればGRPC_ERRORを返す。第1引数に終了したセッションのIDをセットする。 Advanced Industrial Science and Technology / Tokyo Institute of Technology
GridRPC API (7) エラー処理 int grpc_get_last_error(); int grpc_get_error(int sessionID); 第1引数で指定されるセッションIDを持つセッションのエラーコードを取得する。 セッションIDに対応するセッションが存在しない場合は -1を返す void grpc_perror(char * str); 第1引数で与えた文字列の後に、最後に行ったRPC処理のエラー情報の文字列を付加して標準エラーに出力する。 char * grpc_error_string(int error_code); 第1引数で指定されるエラーコードに対応する文字列を返す Advanced Industrial Science and Technology / Tokyo Institute of Technology
サンプルコード #include "grpc.h" #define NUM_HOSTS 8 char * hosts[] = {"host00", "host01", "host02", "host03", "host04", "host05", "host06", "host07"}; grpc_function_handle_t handles[NUM_HOSTS]; int port = 4000; main(int argc, char ** argv){ double pi; long times, count[NUM_HOSTS], sum; char * config_file; int i; if (argc < 3){ fprintf(stderr, "USAGE: %s CONFIG_FILE TIMES \n", argv[0]); exit(2); } config_file = argv[1]; times = atol(argv[2]) / NUM_HOSTS; /* GRPCの初期化 */ if (grpc_initialize(config_file) != GRPC_OK){ grpc_perror("grpc_initialize"); /* ハンドルの初期化 */ for (i = 0; i < NUM_HOSTS; i++) grpc_function_handle_init(&handles[i], hosts[i], port, "pi/pi_trial"); /* ノンブロッキング呼び出しによる並列呼び出し*/ if (gprc_call_async(&handles[i], i, times, &count[i]) == GRPC_ERROR){ grpc_perror("pi_trial"); exit(2); } /* すべての呼び出しの終了を待つ */ if (grpc_wait_all() == GRPC_ERROR){ grpc_perror("wait_all"); /* PIの計算と表示 */ for (i = 0, sum = 0; i < NUM_HOSTS; i++) sum += count[i]; pi = 4.0 * ( sum / ((double) times * NUM_HOSTS)); printf("PI = %f\n", pi); /* GRPC の後処理 */ grpc_finalize(); Advanced Industrial Science and Technology / Tokyo Institute of Technology
まとめ GridRPC のAPIを提案した 現状 クライアントのプログラミングAPIのみ ビルディングブロックとしての柔軟性を重視 Ninfをベースにしたシステム Ninf-G (Ninf on Globus) Advanced Industrial Science and Technology / Tokyo Institute of Technology
今後の課題 柔軟性、機能が十分であることを検証 Global Grid Forum 、APM-WGで提案、修正 ご意見ください http://ninf.apgrid.org/gridrpc_api 複数のGridRPCクライアントが共存可能か? ご意見ください Advanced Industrial Science and Technology / Tokyo Institute of Technology