【Python】各GPUで独立したローカルLLMプロセスを動かす並列化実装をしてみる | TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
単一GPUでの逐次的なLLM実行では、大量の検索結果をリランキングする際に処理時間が膨大になり、計算リソースの活用効率が低下する。また、通常のmultiprocessing(fork)では、親プロセスのCUDAコンテキストを不完全に引き継ぐことで、エラーや予期せぬ動作を引き起こすリスクがある。
// Approach
multiprocessingの`spawn`コンテキストを利用して、各ワーカープロセスを独立した環境で起動する。各プロセス内でモデルロード前に`CUDA_VISIBLE_DEVICES`を設定することで、物理GPUを論理的な`cuda:0`として専有させ、プロセスごとに独立したLLMインスタンスを構築する手法をとる。
// Result
文書をGPU数に応じて分割し、並列にリランキングを実行することで、リソースを効率的に活用した高速な処理を実現した。実装においては、CUDAの初期化順序やプロセス起動方式の制御が、安定した並列処理の鍵であることを示した。
Senior Engineer Insight
> 本実装は、リソースの局所性を利用した極めて実戦的なアプローチである。特にCUDAコンテキストの汚染を防ぐための`spawn`採用や、環境変数によるデバイス制御は、並列推論基盤を構築する際の定石と言える。ただし、本手法は各プロセスがモデルを個別にロードするため、VRAM消費がGPU枚数分に比例して増大する。スケーラビリティの観点からは、単なるプロセス並列化に留まらず、vLLMのような推論エンジンによるバッチング最適化や、モデル共有によるメモリ効率化とのトレードオフを精査する必要がある。