憧れの並列推論マシン
1980年代、20代だった私は国家プロジェクト「第五世代コンピューター計画」に憧れていました。まだ、世界のだれもが達成したことのない目標。渕先生の話でうっすら覚えているのはたしか「並列推論マシンをつくります。これがうまくいくと結果として人工知能もできるでしょう。」そんな話だったように覚えています。
世間的には第五は失敗だったと酷評されることが多いのですが、本当にそうでしょうか?あれから40年経過し確かに並列の時代が来ました。安価のPCでもマルチコアです。ラズパイでさえマルチコアで動作します。そしてDLによるAIの画期的な進歩。ChatGPTは私の技術の相談相手です。間違ったこともいいますけど、彼はなかなか博識です。
DLだけでは直観的な認識はできるようになりましたが、人間の高度な知性である論理的な推論が現在のAIの弱点であり次なる目標だと聞いています。推論といえば元祖、Prologです。
飯高茂先生の本を読みつつ
自作のN-Prologをほぼ完全にRUN/PROLOG(1980年代にライフボートから安価で販売されていた)と互換にしました。飯高先生の本をよみつつまったりとPrologのつもりだったのですが・・・
どうも計算速度が出てません。4メガLIPS程度ですから昔のPCに比べたら遥かにすごいのですけど。SWIに比べると見劣りします。コンパイラの改良をしつつ閃きました。「ああ、そうだ!並列だよ。」
分散並列Prolog
拙作のEasy-ISLispには並列機能を追加しました。分散並列も取り入れています。これを応用してN-Prologも分散並列にしてしまおう。ラズパイのような安価なマシンでクラスタマシンを作ったら楽しい、遊べるかも。
というわけで、個人プロジェクトをスタートさせて楽しく(ときに苦しく)やっています。
こんな仕様です。
npl -n: Launches child Prolog in network mode with the -n option.
dp_create([IP0,IP1, …,IPn]): Provides IP addresse of child machines to establish TCP/IP communication with the parent Lisp. IP addresse is provided as atom. e.g. '178.1.166.2'
dp-and([p0,p1, ...,pn]): It executes the predicates from P0 to PN in parallel. If all of them return YES, it returns YES. If even one returns NO, it returns NO.
dp_or([p0,p1, ...,n]): It executes the predicates from P0 to PN in parallel. If any one of them returns YES, it interrupts the other computations and returns YES.
dp_transfer(Fn): Transfers file Fn to all child machines from the parent machine.
dp_compile(Fn): Compiles file Fn on both parent and child machines.
dp_consult(Fn): Loads file Fn on both parent and child machines.
dp_prove(Nth,Pred): Prove Predicate on the Nth child Prolog for testing.
dp_report(Str): Display String on parent terminal.
dp_close: Sends termination command to child machines and closes communication.
第五計画においては並列用に設計されたGHC,KL1が活躍しました。私もGHCの本を読んだのですが、なかなか困難な問題が多いです。お手軽にPrologの仕様の枠内で並列を試みることにしました。
一歩づつ
いまのところ、下記の写真のような感じでよたよたと動き始めました。
失敗は成功のもと
第五計画は失敗だったと批評されることが多いのですが、少なくとも私はそうは思っていません。世界のだれも挑戦していない野望に果敢に挑戦した先輩日本人たちに敬意を表しつつ、私なりに第五計画の続きをやろうと思っています。