LUPINE: GPU over IP ブリッジ - リモートGPUをCPUのみのマシンに接続
LUPINE は、リモート マシン上の GPU を CPU のみのマシンに接続できるようにする GPU over IP ブリッジです。
ひと目でわかる
- これは何?
- C++で書かれた、クライアント・サーバー方式のブリッジを通じて、CPUのみのマシンがリモートサーバーのGPUを使えるようにするプロジェクト。コンテナイメージと公開デモを備える。
- 誰に向いている?
- READMEには、性能ベンチマーク、セキュリティ保証、サポートの約束は記載されていない。Apache-2.0ライセンスは著作権と特許の許諾を与えるが、保証やサポート義務には触れていない。
- 商用利用できる?
- できます。Apache-2.0 は寛容なライセンスで、著作権表示とライセンス表示を残せば、使用・改変・販売が可能です。
- 今もメンテナンスされている?
- されています。最後のコミットは 2 日前です。
- 何の言語で書かれている?
- 主に C++ です(GitHub の言語統計による)。
回答はプロジェクトの GitHub データ(最終同期:2026年9月14日)と当サイトの分析に基づくもので、法的助言ではありません。
オープンソース詳細解説
GPU over IP: 中核となる考え方
LUPINEはC++で書かれたGPU over IPブリッジとして機能するプロジェクトです。リポジトリの説明には、リモートマシン上のGPUをCPUのみのマシンに接続できるとあります。READMEによると、これはクライアント・サーバー方式で、GPUを所有するマシンでサーバーが、CPUのみのマシンでクライアントが動作します。クライアントはリモートGPUをローカルデバイスとして公開します。ライセンスファイルによれば、プロジェクトはApache-2.0でライセンスされています。READMEには高レベルのアーキテクチャ図や、イメージタグ以外の対応CUDAバージョンの一覧はありません。 実行日時、版、環境、入力識別子、出力要約、警告を記録し、再現不能な結果は成功例として扱いません。 LUPINEはC++で書かれたGPU over IPブリッジとして機能するプロジェクトです。リポジトリの説明には、リモートマシン上のGPUをCPUのみのマシンに接続できるとあります。READMEによると、これはクライアント・サーバー方式で、GPUを所有するマシンでサーバーが、CPUのみのマシンでクライアントが動作します。クライアントはリモートGPUをローカルデバイスとして公開します。ライセンスファイルによれば、プロジェクトはApache-2.0でライセンスされています。READMEには高レベルのアーキテクチャ図や、イメージタグ以外の対応CUDAバージョンの一覧はありません。 実行日時、版、環境、入力識別子、出力要約、警告を記録し、再現不能な結果は成功例として扱いません。 LUPINEはC++で書かれたGPU over IPブリッジとして機能するプロジェクトです。リポジトリの説明には、リモートマシン上のGPUをCPUのみのマシンに接続できるとあります。READMEによると、これはクライアント・サーバー方式で、GPUを所有するマシンでサーバーが、CPUのみのマシンでクライアントが動作します。クライアントはリモートGPUをローカルデバイスとして公開します。ライセンスファイルによれば、プロジェクトはApache-2.0でライセンスされています。READMEには高レベルのアーキテクチャ図や、イメージタグ以外の対応CUDAバージョンの一覧はありません。 実行日時、版、環境、入力識別子、出力要約、警告を記録し、再現不能な結果は成功例として扱いません。 LUPINEはC++で書かれたGPU over IPブリッジとして機能するプロジェクトです。リポジトリの説明には、リモートマシン上のGPUをCPUのみのマシンに接続できるとあります。READMEによると、これはクライアント・サーバー方式で、GPUを所有するマシンでサーバーが、CPUのみのマシンでクライアントが動作します。クライアントはリモートGPUをローカルデバイスとして公開します。ライセンスファイルによれば、プロジェクトはApache-2.0でライセンスされています。READMEには高レベルのアーキテクチャ図や、イメージタグ以外の対応CUDAバージョンの一覧はありません。 実行日時、版、環境、入力識別子、出力要約、警告を記録し、再現不能な結果は成功例として扱いません。
ホステッドデモとMacデモ
READMEには2つのデモが含まれています。1つ目はホステッドデモで、ユーザーはDockerクライアントをdemo.lupinemachines.com:14833に対して実行し、Tesla T4を確認できます。2つ目はMacデモで、`uv run`でPythonスクリプトを実行し、RTX 4090への接続を示します。どちらのデモも公開されたコンテナイメージと`LUPINE_SERVER`環境変数に依存しています。ホステッドデモは無料ですが、GPUのプロビジョニングに時間がかかる可能性があるとREADMEは警告しています。これらのデモが唯一の使用例であり、他のデプロイシナリオは説明されていません。 READMEには2つのデモが含まれています。1つ目はホステッドデモで、ユーザーはDockerクライアントをdemo.lupinemachines.com:14833に対して実行し、Tesla T4を確認できます。2つ目はMacデモで、`uv run`でPythonスクリプトを実行し、RTX 4090への接続を示します。どちらのデモも公開されたコンテナイメージと`LUPINE_SERVER`環境変数に依存しています。ホステッドデモは無料ですが、GPUのプロビジョニングに時間がかかる可能性があるとREADMEは警告しています。これらのデモが唯一の使用例であり、他のデプロイシナリオは説明されていません。 READMEには2つのデモが含まれています。1つ目はホステッドデモで、ユーザーはDockerクライアントをdemo.lupinemachines.com:14833に対して実行し、Tesla T4を確認できます。2つ目はMacデモで、`uv run`でPythonスクリプトを実行し、RTX 4090への接続を示します。どちらのデモも公開されたコンテナイメージと`LUPINE_SERVER`環境変数に依存しています。ホステッドデモは無料ですが、GPUのプロビジョニングに時間がかかる可能性があるとREADMEは警告しています。これらのデモが唯一の使用例であり、他のデプロイシナリオは説明されていません。 READMEには2つのデモが含まれています。1つ目はホステッドデモで、ユーザーはDockerクライアントをdemo.lupinemachines.com:14833に対して実行し、Tesla T4を確認できます。2つ目はMacデモで、`uv run`でPythonスクリプトを実行し、RTX 4090への接続を示します。どちらのデモも公開されたコンテナイメージと`LUPINE_SERVER`環境変数に依存しています。ホステッドデモは無料ですが、GPUのプロビジョニングに時間がかかる可能性があるとREADMEは警告しています。これらのデモが唯一の使用例であり、他のデプロイシナリオは説明されていません。
公開コンテナイメージによるクイックスタート
クイックスタートでは、`lupine-server`と`lupine-client`の2つのGHCRイメージを使用し、タグは`cuda-<cuda-version>-ubuntu<ubuntu-version>`のパターンに従います。例ではUbuntu 24.04上のCUDA 13.1.0を指定しています。サーバーは`--gpus all`で実行し、ポート14833を公開します。クライアントは`-e LUPINE_SERVER=<server>:14833`で実行し、`nvidia-smi`などのコマンドを実行します。クライアントコンテナ内では`LD_LIBRARY_PATH=/opt/lupine/lib`が設定され、CUDAドライバーとNVMLのシムが自動的に使用されます。READMEにはリモートRTX 4090の`nvidia-smi`出力例がありますが、これは説明用でありベンチマークではありません。 クイックスタートでは、`lupine-server`と`lupine-client`の2つのGHCRイメージを使用し、タグは`cuda-<cuda-version>-ubuntu<ubuntu-version>`のパターンに従います。例ではUbuntu 24.04上のCUDA 13.1.0を指定しています。サーバーは`--gpus all`で実行し、ポート14833を公開します。クライアントは`-e LUPINE_SERVER=<server>:14833`で実行し、`nvidia-smi`などのコマンドを実行します。クライアントコンテナ内では`LD_LIBRARY_PATH=/opt/lupine/lib`が設定され、CUDAドライバーとNVMLのシムが自動的に使用されます。READMEにはリモートRTX 4090の`nvidia-smi`出力例がありますが、これは説明用でありベンチマークではありません。 クイックスタートでは、`lupine-server`と`lupine-client`の2つのGHCRイメージを使用し、タグは`cuda-<cuda-version>-ubuntu<ubuntu-version>`のパターンに従います。例ではUbuntu 24.04上のCUDA 13.1.0を指定しています。サーバーは`--gpus all`で実行し、ポート14833を公開します。クライアントは`-e LUPINE_SERVER=<server>:14833`で実行し、`nvidia-smi`などのコマンドを実行します。クライアントコンテナ内では`LD_LIBRARY_PATH=/opt/lupine/lib`が設定され、CUDAドライバーとNVMLのシムが自動的に使用されます。READMEにはリモートRTX 4090の`nvidia-smi`出力例がありますが、これは説明用でありベンチマークではありません。 クイックスタートでは、`lupine-server`と`lupine-client`の2つのGHCRイメージを使用し、タグは`cuda-<cuda-version>-ubuntu<ubuntu-version>`のパターンに従います。例ではUbuntu 24.04上のCUDA 13.1.0を指定しています。サーバーは`--gpus all`で実行し、ポート14833を公開します。クライアントは`-e LUPINE_SERVER=<server>:14833`で実行し、`nvidia-smi`などのコマンドを実行します。クライアントコンテナ内では`LD_LIBRARY_PATH=/opt/lupine/lib`が設定され、CUDAドライバーとNVMLのシムが自動的に使用されます。READMEにはリモートRTX 4090の`nvidia-smi`出力例がありますが、これは説明用でありベンチマークではありません。
接続安定性とグレースフルなサーバーシャットダウン
READMEは接続安定性の機能を説明しています。各クライアント・サーバー接続は単一の長命TCPストリームです。アイドル接続が中間機器によって刈り取られるのを防ぐため、LUPINEはTCPキープアライブを有効にし、アイドル間隔60秒、プローブ間隔15秒、応答なしプローブ3回で諦めます。また、指数バックオフと試行ごとの期限を持つ接続再試行も実装しています。サーバー側では、`SIGTERM`がグレースフルなドレインをトリガーします。サーバーは接続の受け入れを停止し、各接続子プロセスに進行中のCUDA呼び出しを完了するよう求め、それらの終了を待ちます。チェックポイントプロバイダーは`LUPINE_CHECKPOINT_LIBRARY`または`liblupinecr.so`の検索パスで読み込めますが、プロバイダーがなくてもno-opです。プロバイダーは`checkpoint_provider.h`のバージョン付きABIを使用します。 READMEは接続安定性の機能を説明しています。各クライアント・サーバー接続は単一の長命TCPストリームです。アイドル接続が中間機器によって刈り取られるのを防ぐため、LUPINEはTCPキープアライブを有効にし、アイドル間隔60秒、プローブ間隔15秒、応答なしプローブ3回で諦めます。また、指数バックオフと試行ごとの期限を持つ接続再試行も実装しています。サーバー側では、`SIGTERM`がグレースフルなドレインをトリガーします。サーバーは接続の受け入れを停止し、各接続子プロセスに進行中のCUDA呼び出しを完了するよう求め、それらの終了を待ちます。チェックポイントプロバイダーは`LUPINE_CHECKPOINT_LIBRARY`または`liblupinecr.so`の検索パスで読み込めますが、プロバイダーがなくてもno-opです。プロバイダーは`checkpoint_provider.h`のバージョン付きABIを使用します。 READMEは接続安定性の機能を説明しています。各クライアント・サーバー接続は単一の長命TCPストリームです。アイドル接続が中間機器によって刈り取られるのを防ぐため、LUPINEはTCPキープアライブを有効にし、アイドル間隔60秒、プローブ間隔15秒、応答なしプローブ3回で諦めます。また、指数バックオフと試行ごとの期限を持つ接続再試行も実装しています。サーバー側では、`SIGTERM`がグレースフルなドレインをトリガーします。サーバーは接続の受け入れを停止し、各接続子プロセスに進行中のCUDA呼び出しを完了するよう求め、それらの終了を待ちます。チェックポイントプロバイダーは`LUPINE_CHECKPOINT_LIBRARY`または`liblupinecr.so`の検索パスで読み込めますが、プロバイダーがなくてもno-opです。プロバイダーは`checkpoint_provider.h`のバージョン付きABIを使用します。 READMEは接続安定性の機能を説明しています。各クライアント・サーバー接続は単一の長命TCPストリームです。アイドル接続が中間機器によって刈り取られるのを防ぐため、LUPINEはTCPキープアライブを有効にし、アイドル間隔60秒、プローブ間隔15秒、応答なしプローブ3回で諦めます。また、指数バックオフと試行ごとの期限を持つ接続再試行も実装しています。サーバー側では、`SIGTERM`がグレースフルなドレインをトリガーします。サーバーは接続の受け入れを停止し、各接続子プロセスに進行中のCUDA呼び出しを完了するよう求め、それらの終了を待ちます。チェックポイントプロバイダーは`LUPINE_CHECKPOINT_LIBRARY`または`liblupinecr.so`の検索パスで読み込めますが、プロバイダーがなくてもno-opです。プロバイダーは`checkpoint_provider.h`のバージョン付きABIを使用します。
複数GPU対応とTLSエンドポイント
クライアントは`LUPINE_SERVER`をカンマ区切りのリストに設定することで、複数のサーバーに接続できます。デバイスはサーバー順に公開されます。最初のサーバーの全GPU、次に次のサーバーの全GPUという具合です。サーバー間のデバイス間コピーは、クライアント経由でデータをステージングすることでサポートされます。あるサーバーでデバイスからホストへ、別のサーバーでホストからデバイスへ。直接のサーバー間転送、サーバー間のピアアクセス、`cuMemcpy3DPeer`は未実装です。TLSについて、サーバーがTLS終端プロキシの背後にある場合、エンドポイントに`https://`を前置できます。クライアントはシステムトラストストアに対してプロキシ証明書を検証します。平文および`http://`エンドポイントはデフォルトでポート14833を使用します。 クライアントは`LUPINE_SERVER`をカンマ区切りのリストに設定することで、複数のサーバーに接続できます。デバイスはサーバー順に公開されます。最初のサーバーの全GPU、次に次のサーバーの全GPUという具合です。サーバー間のデバイス間コピーは、クライアント経由でデータをステージングすることでサポートされます。あるサーバーでデバイスからホストへ、別のサーバーでホストからデバイスへ。直接のサーバー間転送、サーバー間のピアアクセス、`cuMemcpy3DPeer`は未実装です。TLSについて、サーバーがTLS終端プロキシの背後にある場合、エンドポイントに`https://`を前置できます。クライアントはシステムトラストストアに対してプロキシ証明書を検証します。平文および`http://`エンドポイントはデフォルトでポート14833を使用します。 クライアントは`LUPINE_SERVER`をカンマ区切りのリストに設定することで、複数のサーバーに接続できます。デバイスはサーバー順に公開されます。最初のサーバーの全GPU、次に次のサーバーの全GPUという具合です。サーバー間のデバイス間コピーは、クライアント経由でデータをステージングすることでサポートされます。あるサーバーでデバイスからホストへ、別のサーバーでホストからデバイスへ。直接のサーバー間転送、サーバー間のピアアクセス、`cuMemcpy3DPeer`は未実装です。TLSについて、サーバーがTLS終端プロキシの背後にある場合、エンドポイントに`https://`を前置できます。クライアントはシステムトラストストアに対してプロキシ証明書を検証します。平文および`http://`エンドポイントはデフォルトでポート14833を使用します。 クライアントは`LUPINE_SERVER`をカンマ区切りのリストに設定することで、複数のサーバーに接続できます。デバイスはサーバー順に公開されます。最初のサーバーの全GPU、次に次のサーバーの全GPUという具合です。サーバー間のデバイス間コピーは、クライアント経由でデータをステージングすることでサポートされます。あるサーバーでデバイスからホストへ、別のサーバーでホストからデバイスへ。直接のサーバー間転送、サーバー間のピアアクセス、`cuMemcpy3DPeer`は未実装です。TLSについて、サーバーがTLS終端プロキシの背後にある場合、エンドポイントに`https://`を前置できます。クライアントはシステムトラストストアに対してプロキシ証明書を検証します。平文および`http://`エンドポイントはデフォルトでポート14833を使用します。
ソースからのビルドとローカルクライアントの実行
ソースからLUPINEをビルドするには、まずコード生成ステップを実行する必要があります。`codegen.py`スクリプトはCUDAヘッダーファイル(cuBLAS、cuDNN、NVML、CUDAランタイムヘッダーを含む)を読み取り、RPC呼び出しを生成します。READMEは、適切なCUDAパッケージをインストールしてから`cd codegen && python3 ./codegen.py`を実行するよう指示しています。その後、CMakeを使用します: `cmake -S . -B build` と `cmake --build build`。ビルドにより`libcuda.so.1`、`libnvidia-ml.so.1`、`lupine_driver_server`が生成されます。ローカルクライアント実行では、`LD_PRELOAD=./build/libcuda.so.1`でビルドしたシムをプリロードし、`LUPINE_SERVER`を設定することをREADMEは提案しています。`local.sh`スクリプトも提供されており、サーバー起動やコマンド実行に使えます。 ソースからLUPINEをビルドするには、まずコード生成ステップを実行する必要があります。`codegen.py`スクリプトはCUDAヘッダーファイル(cuBLAS、cuDNN、NVML、CUDAランタイムヘッダーを含む)を読み取り、RPC呼び出しを生成します。READMEは、適切なCUDAパッケージをインストールしてから`cd codegen && python3 ./codegen.py`を実行するよう指示しています。その後、CMakeを使用します: `cmake -S . -B build` と `cmake --build build`。ビルドにより`libcuda.so.1`、`libnvidia-ml.so.1`、`lupine_driver_server`が生成されます。ローカルクライアント実行では、`LD_PRELOAD=./build/libcuda.so.1`でビルドしたシムをプリロードし、`LUPINE_SERVER`を設定することをREADMEは提案しています。`local.sh`スクリプトも提供されており、サーバー起動やコマンド実行に使えます。 ソースからLUPINEをビルドするには、まずコード生成ステップを実行する必要があります。`codegen.py`スクリプトはCUDAヘッダーファイル(cuBLAS、cuDNN、NVML、CUDAランタイムヘッダーを含む)を読み取り、RPC呼び出しを生成します。READMEは、適切なCUDAパッケージをインストールしてから`cd codegen && python3 ./codegen.py`を実行するよう指示しています。その後、CMakeを使用します: `cmake -S . -B build` と `cmake --build build`。ビルドにより`libcuda.so.1`、`libnvidia-ml.so.1`、`lupine_driver_server`が生成されます。ローカルクライアント実行では、`LD_PRELOAD=./build/libcuda.so.1`でビルドしたシムをプリロードし、`LUPINE_SERVER`を設定することをREADMEは提案しています。`local.sh`スクリプトも提供されており、サーバー起動やコマンド実行に使えます。 ソースからLUPINEをビルドするには、まずコード生成ステップを実行する必要があります。`codegen.py`スクリプトはCUDAヘッダーファイル(cuBLAS、cuDNN、NVML、CUDAランタイムヘッダーを含む)を読み取り、RPC呼び出しを生成します。READMEは、適切なCUDAパッケージをインストールしてから`cd codegen && python3 ./codegen.py`を実行するよう指示しています。その後、CMakeを使用します: `cmake -S . -B build` と `cmake --build build`。ビルドにより`libcuda.so.1`、`libnvidia-ml.so.1`、`lupine_driver_server`が生成されます。ローカルクライアント実行では、`LD_PRELOAD=./build/libcuda.so.1`でビルドしたシムをプリロードし、`LUPINE_SERVER`を設定することをREADMEは提案しています。`local.sh`スクリプトも提供されており、サーバー起動やコマンド実行に使えます。
トレースログ、デバイスprintf転送、FAQ
トレースログは、クライアント、サーバー、またはその両方で`LUPINE_TRACE`によって制御されます。値0または未設定でトレース無効、1でstdoutに、2でstderrに書き込み、その他の非空文字列はファイルパスとして扱われます。READMEは`LUPINE_SERVER_TRACE`がもはや使われていないと述べています。LUPINEはまた、アップロードされたPTXおよびcubinデータの`vprintf`を検査して、デバイス`printf`出力を転送します。デバイス出力を利用する可能性のあるイメージが読み込まれるまで同期が回避され、その後、コンテキスト、ストリーム、イベント同期がサーバーfd 1をキャプチャし、バッファをクライアントのstdoutに転送します。FAQセクションでは、遅延(デバイス転送はPCIeリンクがネットワーク経由でボトルネックになるため遅くなるが、トレーニングや推論ではホスト・デバイス間のデータ転送は小さい)、認証(TLS終端プロキシ経由で間接的に)、プロジェクトが一部AI生成であることなどが説明されています。READMEはまた、Thunder Compute、Juice Labs、RCUDAからの先行技術を挙げています。 トレースログは、クライアント、サーバー、またはその両方で`LUPINE_TRACE`によって制御されます。値0または未設定でトレース無効、1でstdoutに、2でstderrに書き込み、その他の非空文字列はファイルパスとして扱われます。READMEは`LUPINE_SERVER_TRACE`がもはや使われていないと述べています。LUPINEはまた、アップロードされたPTXおよびcubinデータの`vprintf`を検査して、デバイス`printf`出力を転送します。デバイス出力を利用する可能性のあるイメージが読み込まれるまで同期が回避され、その後、コンテキスト、ストリーム、イベント同期がサーバーfd 1をキャプチャし、バッファをクライアントのstdoutに転送します。FAQセクションでは、遅延(デバイス転送はPCIeリンクがネットワーク経由でボトルネックになるため遅くなるが、トレーニングや推論ではホスト・デバイス間のデータ転送は小さい)、認証(TLS終端プロキシ経由で間接的に)、プロジェクトが一部AI生成であることなどが説明されています。READMEはまた、Thunder Compute、Juice Labs、RCUDAからの先行技術を挙げています。 トレースログは、クライアント、サーバー、またはその両方で`LUPINE_TRACE`によって制御されます。値0または未設定でトレース無効、1でstdoutに、2でstderrに書き込み、その他の非空文字列はファイルパスとして扱われます。READMEは`LUPINE_SERVER_TRACE`がもはや使われていないと述べています。LUPINEはまた、アップロードされたPTXおよびcubinデータの`vprintf`を検査して、デバイス`printf`出力を転送します。デバイス出力を利用する可能性のあるイメージが読み込まれるまで同期が回避され、その後、コンテキスト、ストリーム、イベント同期がサーバーfd 1をキャプチャし、バッファをクライアントのstdoutに転送します。FAQセクションでは、遅延(デバイス転送はPCIeリンクがネットワーク経由でボトルネックになるため遅くなるが、トレーニングや推論ではホスト・デバイス間のデータ転送は小さい)、認証(TLS終端プロキシ経由で間接的に)、プロジェクトが一部AI生成であることなどが説明されています。READMEはまた、Thunder Compute、Juice Labs、RCUDAからの先行技術を挙げています。 トレースログは、クライアント、サーバー、またはその両方で`LUPINE_TRACE`によって制御されます。値0または未設定でトレース無効、1でstdoutに、2でstderrに書き込み、その他の非空文字列はファイルパスとして扱われます。READMEは`LUPINE_SERVER_TRACE`がもはや使われていないと述べています。LUPINEはまた、アップロードされたPTXおよびcubinデータの`vprintf`を検査して、デバイス`printf`出力を転送します。デバイス出力を利用する可能性のあるイメージが読み込まれるまで同期が回避され、その後、コンテキスト、ストリーム、イベント同期がサーバーfd 1をキャプチャし、バッファをクライアントのstdoutに転送します。FAQセクションでは、遅延(デバイス転送はPCIeリンクがネットワーク経由でボトルネックになるため遅くなるが、トレーニングや推論ではホスト・デバイス間のデータ転送は小さい)、認証(TLS終端プロキシ経由で間接的に)、プロジェクトが一部AI生成であることなどが説明されています。READMEはまた、Thunder Compute、Juice Labs、RCUDAからの先行技術を挙げています。
編集部の結論
READMEには、性能ベンチマーク、セキュリティ保証、サポートの約束は記載されていない。Apache-2.0ライセンスは著作権と特許の許諾を与えるが、保証やサポート義務には触れていない。リポジトリのメタデータには2372スターと131フォークとあるが、README自体にはバージョン番号やリリース履歴は記載されていない。
コミュニティノート