Data Science

NVIDIA cuOpt でルート最適化に革命を起こす

Reading Time: 2 minutes

NVIDIA cuOpt™ は、世界記録を持つ GPU 対応最適化 AI マイクロサービスであり、複数の制約がある複雑なルーティング問題をチームで解決する際に役立ちます。cuOpt では、GPU で高速化する進化したアルゴリズムが使用され、ヒューリスティックス、メタヒューリスティックス、最適化を利用し、多様で制約のある複雑な車両経路問題を計算します。​比類のない精度、ソルバー対応時間、拡張性を備えた cuOpt は、事業をかつてないほどに最適化するパワーを企業に与えます。

NVIDIA AI Enterprise の一部となった cuOpt は、クラウド、オンプレミス、ハイブリッドを問わず、どこにでもデプロイすることができます。非対称パターンの距離行列と時間行列をサポートしているため、一般的なマップ エンジンとシームレスに統合できます。​

この記事では、cuOpt を既存環境にデプロイする方法に関するガイドについてご紹介します。

デプロイの合理化: cuOpt によるさらなる効率化

従来からあるデプロイ最適化ソリューションの多くは、時間のかかるプロセスであり、複雑なハードウェア セットアップ、綿密なソフトウェア インストール、さらに既存システムとの徹底した統合を伴います。必要なハードウェアの構成から、ソフトウェアの広範囲にわたるテストと調整まで、各段階でデプロイ スケジュールが大いに長引き、企業の敏捷性や事業上の要求に対処する力が低下する可能性もあります。

クイックスタート ガイド: cuOpt セルフホステッド サーバーのデプロイ

デプロイの開始前に、前提条件を満たしている環境であることを確認します。詳細と全体的なガイドについては、cuOpt セルフホステッド サーバーの概要をご参照ください。

前提条件:

  1. NVIDIA AI Enterprise ライセンス
    • NVIDIA AI Enterprise のサブスクリプションを取得します。これには、データ センターやクラウドでホストする cuOpt コンテナーが付属します。
  2. NGC にアクセスする
    • 招待案内を利用して NVIDIA NGC にログインし、適切な NGC 組織を選択します。
    • 設定から NGC API キーを生成します。API キーを生成していない場合、プロファイルの [Setup (設定)] オプションに移動し、[Get API Key (API キーを取得)] を選択することで生成できます。これを保存するか、次回新しいものを生成します。詳細はこちらでご確認いただけます。
  3. システム要件:
    • nvidia-docker2 をインストールする必要があります
    • Ampere アーキテクチャ以上を採用した単体の NVIDIA GPU が最適です
    • CPU – x86-64 >= 8 コア (推奨)
    • メモリ >= 16 GB (推奨)
    • 最小ストレージ: 20 GB (8 GB コンテナー サイズ)
    • CUDA 11.8+
    • 計算機能 >= 8.x
    • NVIDIA ドライバーの最小バージョン: 450.36.06

    Step 1. NVIDIA コンテナー レジストリにログインする

    以下に示すように、NGC API キーを使用し、クラスター セットアップで nvcr.io コンテナー レジストリにログインします。

    docker login nvcr.io
    Username: $oauthtoken
    Password: <my-api-key>

     Step 2. cuOpt コンテナーを取得する

    まずは、NGC (※表示するにはログインが必要です。) から現行バージョンの cuOpt のイメージを取得します。以下のように、コンテナー タグとバージョンを NGC からコピーし、環境変数として保存します。

    # Save the image tag in a variable for use 
    export CUOPT_IMAGE=<CONTAINER_TAG_COPIED_FROM_NGC:TAG_VERSION>
    docker pull $CUOPT_IMAGE

    または、NGC CLI ツールをダウンロードしている場合、NGC レジストリ コマンドを使用できます。NGC CLI ツールのインストール方法とセットアップ方法は NGC にあります。

    ngc registry image pull $CUOPT_IMAGE

    以下のコマンドを実行し、cuOpt コンテナーを実行します。cuOpt サーバーがデプロイされます。

    • `CUDA_VISIBLE_DEVICES` を使用して GPU を指定し、メモリ サイズ `shm-size` を自分の環境に合わせて調整します。
    •  IP アドレスとポート番号を必要に応じて調整してください。ここでは `localhost` と `8080` が例として使用されています。cuOpt サーバーに別のマシンからアクセスしている場合、あるいはポートが変更された場合、IP アドレスとポート番号を適宜更新しなければならないことがあります。
    docker run -it --rm \
        --runtime=nvidia \
        --shm-size=8G \
        -e CUDA_VISIBLE_DEVICES=0 \
        -e CUOPT_SERVER_PORT=8080 \
        -e CUOPT_SERVER_LOG_LEVEL="info" \
        -p 8080:8080 \
        --name self_host_cuopt \
        -d $CUOPT_IMAGE

    Step 4. マイクロサービスの状態を確認/監視する (任意)

    正常性を確認し、応答を確認します。

    curl localhost:8080/v2/health/live
    
    # response
    {"status":"RUNNING","version":"24.03"} 

    マイクロサービスを監視するために、起動の成功をログで確認します。

    docker logs --follow self_host_cuopt
    
    # output belike
    2024-06-04 03:23:28.595 INFO cuopt server version 24.03.00a172
    2024-06-04 03:23:28.632 INFO solver waiting on job queue
    2024-06-04 03:23:28.636 INFO receive results waiting on result queue
    2024-06-04 03:23:28.674 INFO Started server process [92]
    2024-06-04 03:23:28.676 INFO Waiting for application startup.
    2024-06-04 03:23:28.676 INFO Application startup complete.
    2024-06-04 03:23:28.676 INFO Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit) 

    Step 5. 起動した cuOpt インスタンスから推論を要求する

    cuOpt セルフホステッド サーバーに要求を送信します。ここでは `curl` を使用してサーバーと通信しています。オープン API ドキュメントを参照し、さらに詳しい要件を構成できます。

    ここでは「容量制約つき運搬経路問題 (CVRP)」のユース ケースを作成しています。このシナリオでは、3 台の車両 (2 台のトラックと 1 台のバン) で 1 つの倉庫から 7 つの異なる配送先まで荷物を届けます。ソルバー時間の上限は 5 秒に設定されています。

    curl -L 'http://localhost:8080/cuopt/routes' \
    	-H 'Content-Type: application/json' \
    	-H "CLIENT-VERSION: custom" \
    	-d '{
    		"cost_matrix_data": {
    			"data": {"0": [
    			[0.0, 3.1, 5.0, 3.6, 3.6, 4.5, 3.6, 1.4],
    			[3.1, 0.0, 7.3, 2.2, 6.4, 1.4, 6.7, 4.0],
    			[5.0, 7.3, 0.0, 6.0, 6.3, 8.1, 5.1, 3.6],
    			[3.6, 2.2, 6.0, 0.0, 7.2, 2.2, 7.1, 3.6],
    			[3.6, 6.4, 6.3, 7.2, 0.0, 7.8, 1.4, 4.1],
    			[4.5, 1.4, 8.1, 2.2, 7.8, 0.0, 8.1, 5.1],
    			[3.6, 6.7, 5.1, 7.1, 1.4, 8.1, 0.0, 3.6],
    			[1.4, 4.0, 3.6, 3.6, 4.1, 5.1, 3.6, 0.0]]} },
    		"task_data": {
    			"task_locations": [1,2,3,4,5,6,7], 
    			"demand": [[4,4,2,2,1,2,1]] }, 
    		"fleet_data": {
    			"vehicle_locations":[[0,0],[0,0],[0,0]], 
    			"min_vehicles": 3,
    			"capacities": [[8,8,4]] },
    		"solver_config": {
    			"time_limit": 5}
        }'

    JSON 形式の応答には、計算された経路とその効率が詳しく説明されています。

    # response belike
    {"response":{"solver_response":{"status":0,"num_vehicles":3,"solution_cost":28.199999570846558,"vehicle_data":{"0":{"task_id":["Depot","0","4","2","Depot"],"arrival_stamp":[0.0,0.0,0.0,0.0,0.0],"route":[0,1,5,3,0],"type":["Depot","Delivery","Delivery","Delivery","Depot"]},"1":{"task_id":["Depot","1","5","3","Depot"],"arrival_stamp":[0.0,0.0,0.0,0.0,0.0],"route":[0,2,6,4,0],"type":["Depot","Delivery","Delivery","Delivery","Depot"]},"2":{"task_id":["Depot","6","Depot"],"arrival_stamp":[0.0,0.0,0.0],"route":[0,7,0],"type":["Depot","Delivery","Depot"]}},"dropped_tasks":{"task_id":[],"task_index":[]},"msg":""},"perf_times":null},"warnings":[],"notes":[],"reqId":"6e48f39c-facc-414e-b500-dbb6a1fb6ff4"}

    ご注意: この例では、IP アドレスとポート番号に既定値を使用しています。ポート番号が変更された場合、あるいは要求が異なるマシン (つまり、cuOpt が実行されているマシンではない) から送信された場合、IP アドレスとポート番号の両方または一方を API 呼び出しで変更する必要があります。

    まとめ

    このクイックスタート ガイドでは、cuOpt をデプロイするための簡単な手順を説明しました。この手順に従うことで、お使いの環境で cuOpt を正常に起動し、高度なルート最適化を実行できます。

     cuOpt は NVIDIA API カタログで利用できるようになりました。是非、無料で試し、高速化されたルート最適化の革新的なパワーをご体験ください。

     cuOpt をより深く知り、使い始めるには、以下の記事もご覧ください。


    関連情報

    Tags