From 109d906abbf8375d9794b86f7cec7edfba464da5 Mon Sep 17 00:00:00 2001 From: M Q Date: Wed, 3 Jun 2026 23:50:14 -0700 Subject: [PATCH 01/11] Updated code due to dependencies' API changes Signed-off-by: M Q --- monai/deploy/graphs/__init__.py | 9 +- monai/deploy/utils/importutil.py | 3 +- notebooks/tutorials/01_simple_app.ipynb | 1478 +------- .../tutorials/02_mednist_app-prebuilt.ipynb | 544 +-- notebooks/tutorials/02_mednist_app.ipynb | 1109 +----- notebooks/tutorials/03_segmentation_app.ipynb | 1423 +------- notebooks/tutorials/04_monai_bundle_app.ipynb | 3100 +++++------------ notebooks/tutorials/05_multi_model_app.ipynb | 1252 +------ requirements-examples.txt | 2 +- requirements.txt | 4 +- 10 files changed, 1094 insertions(+), 7830 deletions(-) diff --git a/monai/deploy/graphs/__init__.py b/monai/deploy/graphs/__init__.py index 6005a2d7..2d76a90f 100644 --- a/monai/deploy/graphs/__init__.py +++ b/monai/deploy/graphs/__init__.py @@ -1 +1,8 @@ -from holoscan.graphs import * +try: + from holoscan.flow_graphs import * +except ModuleNotFoundError: + from holoscan.graphs import * + +# holoscan 4.1.0 renamed FlowGraph to FlowGraphImpl +if "FlowGraph" not in globals() and "FlowGraphImpl" in globals(): + FlowGraph = FlowGraphImpl diff --git a/monai/deploy/utils/importutil.py b/monai/deploy/utils/importutil.py index d35b4173..0295f691 100644 --- a/monai/deploy/utils/importutil.py +++ b/monai/deploy/utils/importutil.py @@ -437,7 +437,8 @@ def dist_requires(project_name: str) -> List[str]: _EXTRA_MODULES = [ "conditions", "executors", - "graphs", + "flow_graphs", # holoscan >= 4.1.0 + "graphs", # holoscan < 4.1.0 "logger", "operators", "resources", diff --git a/notebooks/tutorials/01_simple_app.ipynb b/notebooks/tutorials/01_simple_app.ipynb index 4981f75a..b0516a7c 100644 --- a/notebooks/tutorials/01_simple_app.ipynb +++ b/notebooks/tutorials/01_simple_app.ipynb @@ -54,21 +54,9 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ":1184: FutureWarning: The cuda.cudart module is deprecated and will be removed in a future release, please switch to use the cuda.bindings.runtime module instead.\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/holoscan/core/__init__.py:106: RuntimeWarning: Current stack size (8.0 MB) is below the recommended minimum (32.0 MB). This may cause segmentation faults or crashes. Consider increasing the stack size with 'ulimit -s 32768', or if using Docker, launch the container with '--ulimit stack=33554432'.\n", - " warnings.warn(\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/monai/deploy/utils/importutil.py:20: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.\n", - " import pkg_resources\n" - ] - } - ], + "outputs": [], "source": [ "# Install necessary image loading/processing packages for the application\n", "!python -c \"import PIL\" || pip install -q \"Pillow\"\n", @@ -94,45 +82,9 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Test input file path: '/tmp/simple_app/normal-brain-mri-4.png'\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_3820941/2727006292.py:16: FutureWarning: `imshow` is deprecated since version 0.25 and will be removed in version 0.27. Please use `matplotlib`, `napari`, etc. to visualize images.\n", - " io.imshow(test_image)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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kZgjRPUIx7E+CMexPgjHsX4Ix7I+8BvHIJovUVMijhAhQoQIESJEdQgJOESIECFChNgAbFoCbmlpwWOPPRZm0KoR4TjWB+E41gfhONYP4VjWB5dyHDdlEFaIECFChAix2bFpNeAQIUKECBFiMyMk4BAhQoQIEWIDEBJwiBAhQoQIsQEICThEiBAhQoTYAIQEHCJEiBAhQmwANiUB/8M//AO2b9+OWCyGgwcP4sc//vFGd+mKwv/8z//g/e9/PwYGBhCJRPDkk09WfO84Dv70T/8U/f39iMfjOHz4ME6cOFFRZmZmBo888giSySTS6TQ+9rGPYX5+/jLexcbj8ccfxx133IH29nb09PTgl3/5l3H8+PGKMktLS3j00UfR2dmJtrY2fOhDH8LExERFmdHRUTz00ENobW1FT08PPve5z2F1dfVy3sqG4stf/jL27t2rMgkdOnQITz31lPo+HMPq8KUvfQmRSASf/vSn1WfhWNrhi1/8ojrFjD+7d+9W31+2cXQ2GZ544gmnubnZ+dd//Vfntddec37rt37LSafTzsTExEZ37YrBd77zHeeP/uiPnP/8z/90ADjf+MY3Kr7/0pe+5KRSKefJJ590Xn75ZeeXfumXnB07djilUkmVee973+vs27fPef75553//d//da6//nrn4Ycfvsx3srF44IEHnK985SvOsWPHnKNHjzq/+Iu/6Gzbts2Zn59XZT7+8Y87W7dudZ555hnnpz/9qXPXXXc5d999t/p+dXXVueWWW5zDhw87L730kvOd73zH6erqcr7whS9sxC1tCL75zW863/72t5233nrLOX78uPOHf/iHTlNTk3Ps2DHHccIxrAY//vGPne3btzt79+51PvWpT6nPw7G0w2OPPebcfPPNzvj4uPrJ5XLq+8s1jpuOgO+8807n0UcfVf+vra05AwMDzuOPP76BvbpyoRPw+vq609fX5/zVX/2V+mxubs5paWlx/v3f/91xHMd5/fXXHQDOT37yE1XmqaeeciKRiHP27NnL1vcrDZOTkw4A59lnn3Uc5/y4NTU1OV//+tdVmTfeeMMB4Bw5csRxnPPCUDQadbLZrCrz5S9/2Ukmk87y8vLlvYErCJlMxvmXf/mXcAyrQLFYdHbt2uU8/fTTzn333acIOBxLezz22GPOvn37jN9dznHcVCbocrmMF198EYcPH1afRaNRHD58GEeOHNnAnm0eDA8PI5vNVoxhKpXCwYMH1RgeOXIE6XQaBw4cUGUOHz6MaDSKF1544bL3+UpBPp8HAHR0dAAAXnzxRaysrFSM5e7du7Ft27aKsbz11lvR29uryjzwwAMoFAp47bXXLmPvrwysra3hiSeewMLCAg4dOhSOYRV49NFH8dBDD1WMGRDOx6A4ceIEBgYGcN111+GRRx7B6OgogMs7jpvqNKSpqSmsra1V3DQA9Pb24s0339ygXm0uZLNZADCOIb/LZrPo6emp+L6xsREdHR2qzLWG9fV1fPrTn8Y999yDW265BcD5cWpubkY6na4oq4+laaz53bWCV199FYcOHcLS0hLa2trwjW98AzfddBOOHj0ajmEAPPHEE/jZz36Gn/zkJxd9F85Hexw8eBBf/epXceONN2J8fBx/9md/hnvvvRfHjh27rOO4qQg4RIiNwqOPPopjx47hueee2+iubErceOONOHr0KPL5PP7jP/4DH/nIR/Dss89udLc2Fc6cOYNPfepTePrppxGLxTa6O5saDz74oPp77969OHjwIIaGhvC1r30N8Xj8svVjU5mgu7q60NDQcFE02sTEBPr6+jaoV5sLHCevMezr68Pk5GTF96urq5iZmbkmx/mTn/wkvvWtb+EHP/gBBgcH1ed9fX0ol8uYm5urKK+PpWms+d21gubmZlx//fXYv38/Hn/8cezbtw9/+7d/G45hALz44ouYnJzE7bffjsbGRjQ2NuLZZ5/F3/3d36GxsRG9vb3hWFaJdDqNG264ASdPnrysc3JTEXBzczP279+PZ555Rn22vr6OZ555BocOHdrAnm0e7NixA319fRVjWCgU8MILL6gxPHToEObm5vDiiy+qMt///vexvr6OgwcPXvY+bxQcx8EnP/lJfOMb38D3v/997Nixo+L7/fv3o6mpqWIsjx8/jtHR0YqxfPXVVysEmqeffhrJZBI33XTT5bmRKxDr6+tYXl4OxzAA3vOe9+DVV1/F0aNH1c+BAwfwyCOPqL/DsawO8/PzOHXqFPr7+y/vnKwqhGwD8cQTTzgtLS3OV7/6Vef11193fvu3f9tJp9MV0WjXOorFovPSSy85L730kgPA+eu//mvnpZdeckZGRhzHOb8NKZ1OO//1X//lvPLKK84HPvAB4zak2267zXnhhRec5557ztm1a9c1tw3pE5/4hJNKpZwf/vCHFdsVFhcXVZmPf/zjzrZt25zvf//7zk9/+lPn0KFDzqFDh9T33K5w//33O0ePHnW++93vOt3d3dfUto/Pf/7zzrPPPusMDw87r7zyivP5z3/eiUQizve+9z3HccIxrAUyCtpxwrG0xWc/+1nnhz/8oTM8POz86Ec/cg4fPux0dXU5k5OTjuNcvnHcdATsOI7z93//9862bduc5uZm584773Sef/75je7SFYUf/OAHDoCLfj7ykY84jnN+K9Kf/MmfOL29vU5LS4vznve8xzl+/HhFHdPT087DDz/stLW1Oclk0vnoRz/qFIvFDbibjYNpDAE4X/nKV1SZUqnk/M7v/I6TyWSc1tZW54Mf/KAzPj5eUc/bb7/tPPjgg048Hne6urqcz372s87KysplvpuNw2/+5m86Q0NDTnNzs9Pd3e285z3vUeTrOOEY1gKdgMOxtMOHP/xhp7+/32lubna2bNnifPjDH3ZOnjypvr9c4xieBxwiRIgQIUJsADaVDzhEiBAhQoS4WhAScIgQIUKECLEBCAk4RIgQIUKE2ACEBBwiRIgQIUJsAEICDhEiRIgQITYAIQGHCBEiRIgQG4CQgEOECBEiRIgNQEjAIUKECBEixAYgJOAQIUKECBFiAxAScIgQIUKECLEBCAk4RIgQIUKE2AD8Pz66mQm41jf1AAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "test_input_folder = \"/tmp/simple_app\"\n", "test_input_path = test_input_folder + \"/normal-brain-mri-4.png\"\n", @@ -165,20 +117,9 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "env: HOLOSCAN_INPUT_FOLDER=/tmp/simple_app\n", - "env: HOLOSCAN_INPUT_PATH=/tmp/simple_app/normal-brain-mri-4.png\n", - "env: HOLOSCAN_OUTPUT_PATH=output\n", - "/tmp/simple_app/normal-brain-mri-4.png\n" - ] - } - ], + "outputs": [], "source": [ "output_path = \"output\"\n", "%env HOLOSCAN_INPUT_FOLDER {test_input_folder}\n", @@ -199,7 +140,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -232,7 +173,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -303,7 +244,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -355,7 +296,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -448,17 +389,9 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The statement, App().run(), is needed when this is run directly by the interpreter.\n" - ] - } - ], + "outputs": [], "source": [ "class App(Application):\n", " \"\"\"This is a very basic application.\n", @@ -527,61 +460,9 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[warning] [application.cpp:289] Current stack size limit (8388608 bytes / 8192 KB) is below the recommended minimum (33554432 bytes / 32768 KB). Consider increasing it with 'ulimit -s 32768'. For Docker, use '--ulimit stack=33554432'\n", - "[info] [fragment.cpp:1186] Loading extensions from configs...\n", - "[2026-01-29 19:20:18,872] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=[])\n", - "[2026-01-29 19:20:18,882] [INFO] (root) - AppContext object: AppContext(input_path=/tmp/simple_app/normal-brain-mri-4.png, output_path=output, model_path=models, workdir=), triton_server_netloc=\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "sample_data_path: /tmp/simple_app/normal-brain-mri-4.png\n", - "Number of times operator sobel_op whose class is defined in __main__ called: 1\n", - "Input from: /tmp/simple_app/normal-brain-mri-4.png, whose absolute path: /tmp/simple_app/normal-brain-mri-4.png\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[info] [gxf_executor.cpp:400] Creating context\n", - "[info] [gxf_executor.cpp:2427] Activating Graph...\n", - "[info] [gxf_executor.cpp:2607] Running Graph...\n", - "[info] [gxf_executor.cpp:2609] Waiting for completion...\n", - "[info] [greedy_scheduler.cpp:191] Scheduling 3 entities\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of times operator median_op whose class is defined in __main__ called: 1\n", - "Number of times operator gaussian_op whose class is defined in __main__ called: 1\n", - "Data type of output: , max = 0.35821119421406195\n", - "Data type of output post conversion: , max = 91\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[info] [greedy_scheduler.cpp:405] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "[info] [greedy_scheduler.cpp:435] Scheduler finished.\n", - "[info] [gxf_executor.cpp:2616] Deactivating Graph...\n", - "[info] [gxf_executor.cpp:2625] Graph execution finished.\n", - "[info] [gxf_executor.cpp:435] Destroying context\n" - ] - } - ], + "outputs": [], "source": [ "!rm -rf {output_path}\n", "App().run()" @@ -589,55 +470,18 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "final_output.png\n" - ] - } - ], + "outputs": [], "source": [ "!ls {output_path}" ] }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_3820941/1643627018.py:3: FutureWarning: `imshow` is deprecated since version 0.25 and will be removed in version 0.27. Please use `matplotlib`, `napari`, etc. to visualize images.\n", - " io.imshow(output_image)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "output_image_path = output_path + \"/final_output.png\"\n", "output_image = io.imread(output_image_path)\n", @@ -670,7 +514,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -688,17 +532,9 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Overwriting simple_imaging_app/sobel_operator.py\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile simple_imaging_app/sobel_operator.py\n", "\n", @@ -768,17 +604,9 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Overwriting simple_imaging_app/median_operator.py\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile simple_imaging_app/median_operator.py\n", "from monai.deploy.core import Fragment, Operator, OperatorSpec\n", @@ -830,17 +658,9 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Overwriting simple_imaging_app/gaussian_operator.py\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile simple_imaging_app/gaussian_operator.py\n", "from pathlib import Path\n", @@ -926,17 +746,9 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Overwriting simple_imaging_app/app.py\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile simple_imaging_app/app.py\n", "import logging\n", @@ -1028,17 +840,9 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Overwriting simple_imaging_app/__main__.py\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile simple_imaging_app/__main__.py\n", "from app import App\n", @@ -1049,18 +853,9 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "app.py\t gaussian_operator.py\tmedian_operator.py requirements.txt\n", - "app.yaml __main__.py\t\t__pycache__\t sobel_operator.py\n" - ] - } - ], + "outputs": [], "source": [ "!ls simple_imaging_app" ] @@ -1079,96 +874,9 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ":1184: FutureWarning: The cuda.cudart module is deprecated and will be removed in a future release, please switch to use the cuda.bindings.runtime module instead.\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/holoscan/core/__init__.py:106: RuntimeWarning: Current stack size (8.0 MB) is below the recommended minimum (32.0 MB). This may cause segmentation faults or crashes. Consider increasing the stack size with 'ulimit -s 32768', or if using Docker, launch the container with '--ulimit stack=33554432'.\n", - " warnings.warn(\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/monai/deploy/utils/importutil.py:20: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.\n", - " import pkg_resources\n", - "[\u001b[33m\u001b[1mwarning\u001b[m] [application.cpp:289] Current stack size limit (8388608 bytes / 8192 KB) is below the recommended minimum (33554432 bytes / 32768 KB). Consider increasing it with 'ulimit -s 32768'. For Docker, use '--ulimit stack=33554432'\n", - "[\u001b[32minfo\u001b[m] [fragment.cpp:1186] Loading extensions from configs...\n", - "[2026-01-29 19:20:24,412] [INFO] (root) - Parsed args: Namespace(log_level='DEBUG', input=PosixPath('/tmp/simple_app'), output=PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/output'), model=None, workdir=None, triton_server_netloc=None, argv=['simple_imaging_app', '-i', '/tmp/simple_app', '-o', 'output', '-l', 'DEBUG'])\n", - "[2026-01-29 19:20:24,414] [INFO] (root) - AppContext object: AppContext(input_path=/tmp/simple_app, output_path=/home/mqin/src/md-app-sdk/notebooks/tutorials/output, model_path=models, workdir=), triton_server_netloc=\n", - "[2026-01-29 19:20:24,414] [INFO] (root) - sample_data_path: /tmp/simple_app\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:400] Creating context\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2427] Activating Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2607] Running Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2609] Waiting for completion...\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:191] Scheduling 3 entities\n", - "Number of times operator sobel_op whose class is defined in sobel_operator called: 1\n", - "Input from: /tmp/simple_app, whose absolute path: /tmp/simple_app\n", - "[2026-01-29 19:20:24,479] [DEBUG] (PIL.PngImagePlugin) - STREAM b'IHDR' 16 13\n", - "[2026-01-29 19:20:24,479] [DEBUG] (PIL.PngImagePlugin) - STREAM b'sRGB' 41 1\n", - "[2026-01-29 19:20:24,479] [DEBUG] (PIL.PngImagePlugin) - STREAM b'gAMA' 54 4\n", - "[2026-01-29 19:20:24,479] [DEBUG] (PIL.PngImagePlugin) - STREAM b'pHYs' 70 9\n", - "[2026-01-29 19:20:24,479] [DEBUG] (PIL.PngImagePlugin) - STREAM b'IDAT' 91 65445\n", - "Number of times operator median_op whose class is defined in median_operator called: 1\n", - "Number of times operator gaussian_op whose class is defined in gaussian_operator called: 1\n", - "Data type of output: , max = 0.35821119421406195\n", - "Data type of output post conversion: , max = 91\n", - "[2026-01-29 19:20:24,729] [DEBUG] (PIL.Image) - Importing AvifImagePlugin\n", - "[2026-01-29 19:20:24,733] [DEBUG] (PIL.Image) - Importing BlpImagePlugin\n", - "[2026-01-29 19:20:24,734] [DEBUG] (PIL.Image) - Importing BmpImagePlugin\n", - "[2026-01-29 19:20:24,734] [DEBUG] (PIL.Image) - Importing BufrStubImagePlugin\n", - "[2026-01-29 19:20:24,735] [DEBUG] (PIL.Image) - Importing CurImagePlugin\n", - "[2026-01-29 19:20:24,735] [DEBUG] (PIL.Image) - Importing DcxImagePlugin\n", - "[2026-01-29 19:20:24,736] [DEBUG] (PIL.Image) - Importing DdsImagePlugin\n", - "[2026-01-29 19:20:24,739] [DEBUG] (PIL.Image) - Importing EpsImagePlugin\n", - "[2026-01-29 19:20:24,739] [DEBUG] (PIL.Image) - Importing FitsImagePlugin\n", - "[2026-01-29 19:20:24,740] [DEBUG] (PIL.Image) - Importing FliImagePlugin\n", - "[2026-01-29 19:20:24,740] [DEBUG] (PIL.Image) - Importing FpxImagePlugin\n", - "[2026-01-29 19:20:24,741] [DEBUG] (PIL.Image) - Image: failed to import FpxImagePlugin: No module named 'olefile'\n", - "[2026-01-29 19:20:24,741] [DEBUG] (PIL.Image) - Importing FtexImagePlugin\n", - "[2026-01-29 19:20:24,741] [DEBUG] (PIL.Image) - Importing GbrImagePlugin\n", - "[2026-01-29 19:20:24,741] [DEBUG] (PIL.Image) - Importing GifImagePlugin\n", - "[2026-01-29 19:20:24,741] [DEBUG] (PIL.Image) - Importing GribStubImagePlugin\n", - "[2026-01-29 19:20:24,742] [DEBUG] (PIL.Image) - Importing Hdf5StubImagePlugin\n", - "[2026-01-29 19:20:24,742] [DEBUG] (PIL.Image) - Importing IcnsImagePlugin\n", - "[2026-01-29 19:20:24,743] [DEBUG] (PIL.Image) - Importing IcoImagePlugin\n", - "[2026-01-29 19:20:24,744] [DEBUG] (PIL.Image) - Importing ImImagePlugin\n", - "[2026-01-29 19:20:24,744] [DEBUG] (PIL.Image) - Importing ImtImagePlugin\n", - "[2026-01-29 19:20:24,745] [DEBUG] (PIL.Image) - Importing IptcImagePlugin\n", - "[2026-01-29 19:20:24,745] [DEBUG] (PIL.Image) - Importing JpegImagePlugin\n", - "[2026-01-29 19:20:24,745] [DEBUG] (PIL.Image) - Importing Jpeg2KImagePlugin\n", - "[2026-01-29 19:20:24,745] [DEBUG] (PIL.Image) - Importing McIdasImagePlugin\n", - "[2026-01-29 19:20:24,746] [DEBUG] (PIL.Image) - Importing MicImagePlugin\n", - "[2026-01-29 19:20:24,746] [DEBUG] (PIL.Image) - Image: failed to import MicImagePlugin: No module named 'olefile'\n", - "[2026-01-29 19:20:24,746] [DEBUG] (PIL.Image) - Importing MpegImagePlugin\n", - "[2026-01-29 19:20:24,747] [DEBUG] (PIL.Image) - Importing MpoImagePlugin\n", - "[2026-01-29 19:20:24,748] [DEBUG] (PIL.Image) - Importing MspImagePlugin\n", - "[2026-01-29 19:20:24,748] [DEBUG] (PIL.Image) - Importing PalmImagePlugin\n", - "[2026-01-29 19:20:24,749] [DEBUG] (PIL.Image) - Importing PcdImagePlugin\n", - "[2026-01-29 19:20:24,749] [DEBUG] (PIL.Image) - Importing PcxImagePlugin\n", - "[2026-01-29 19:20:24,749] [DEBUG] (PIL.Image) - Importing PdfImagePlugin\n", - "[2026-01-29 19:20:24,763] [DEBUG] (PIL.Image) - Importing PixarImagePlugin\n", - "[2026-01-29 19:20:24,764] [DEBUG] (PIL.Image) - Importing PngImagePlugin\n", - "[2026-01-29 19:20:24,764] [DEBUG] (PIL.Image) - Importing PpmImagePlugin\n", - "[2026-01-29 19:20:24,764] [DEBUG] (PIL.Image) - Importing PsdImagePlugin\n", - "[2026-01-29 19:20:24,765] [DEBUG] (PIL.Image) - Importing QoiImagePlugin\n", - "[2026-01-29 19:20:24,765] [DEBUG] (PIL.Image) - Importing SgiImagePlugin\n", - "[2026-01-29 19:20:24,766] [DEBUG] (PIL.Image) - Importing SpiderImagePlugin\n", - "[2026-01-29 19:20:24,767] [DEBUG] (PIL.Image) - Importing SunImagePlugin\n", - "[2026-01-29 19:20:24,768] [DEBUG] (PIL.Image) - Importing TgaImagePlugin\n", - "[2026-01-29 19:20:24,768] [DEBUG] (PIL.Image) - Importing TiffImagePlugin\n", - "[2026-01-29 19:20:24,768] [DEBUG] (PIL.Image) - Importing WebPImagePlugin\n", - "[2026-01-29 19:20:24,774] [DEBUG] (PIL.Image) - Importing WmfImagePlugin\n", - "[2026-01-29 19:20:24,775] [DEBUG] (PIL.Image) - Importing XbmImagePlugin\n", - "[2026-01-29 19:20:24,780] [DEBUG] (PIL.Image) - Importing XpmImagePlugin\n", - "[2026-01-29 19:20:24,781] [DEBUG] (PIL.Image) - Importing XVThumbImagePlugin\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:405] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:435] Scheduler finished.\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2616] Deactivating Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2625] Graph execution finished.\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:435] Destroying context\n" - ] - } - ], + "outputs": [], "source": [ "!rm -rf {output_path}\n", "!python simple_imaging_app -i {test_input_folder} -o {output_path} -l DEBUG" @@ -1176,38 +884,9 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_3820941/3197869135.py:3: FutureWarning: `imshow` is deprecated since version 0.25 and will be removed in version 0.27. Please use `matplotlib`, `napari`, etc. to visualize images.\n", - " io.imshow(output_image)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "#output_image_path was set as before, output_image_path = output_path + \"/final_output.png\"\n", "output_image = io.imread(output_image_path)\n", @@ -1234,17 +913,9 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Overwriting simple_imaging_app/app.yaml\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile simple_imaging_app/app.yaml\n", "%YAML 1.2\n", @@ -1264,17 +935,9 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Overwriting simple_imaging_app/requirements.txt\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile simple_imaging_app/requirements.txt\n", "scikit-image\n", @@ -1290,857 +953,23 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2026-01-29 19:20:26,558] [INFO] (common) - Downloading CLI manifest file from https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/refs/heads/main/releases/3.10.0/artifacts-cu12.json...\n", - "[2026-01-29 19:20:26,746] [DEBUG] (common) - Validating CLI manifest file...\n", - "[2026-01-29 19:20:26,748] [INFO] (packager.parameters) - Application: /home/mqin/src/md-app-sdk/notebooks/tutorials/simple_imaging_app\n", - "[2026-01-29 19:20:26,748] [INFO] (packager.parameters) - Detected application type: Python Module\n", - "[2026-01-29 19:20:26,748] [INFO] (packager) - Reading application configuration from /home/mqin/src/md-app-sdk/notebooks/tutorials/simple_imaging_app/app.yaml...\n", - "[2026-01-29 19:20:26,753] [INFO] (packager) - Generating app.json...\n", - "[2026-01-29 19:20:26,753] [INFO] (packager) - Generating pkg.json...\n", - "[2026-01-29 19:20:26,825] [DEBUG] (common) - \n", - "=============== Begin app.json ===============\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"command\": \"[\\\"python3\\\", \\\"/opt/holoscan/app\\\"]\",\n", - " \"environment\": {\n", - " \"HOLOSCAN_APPLICATION\": \"/opt/holoscan/app\",\n", - " \"HOLOSCAN_INPUT_PATH\": \"input/\",\n", - " \"HOLOSCAN_OUTPUT_PATH\": \"output/\",\n", - " \"HOLOSCAN_WORKDIR\": \"/var/holoscan\",\n", - " \"HOLOSCAN_MODEL_PATH\": \"/opt/holoscan/models\",\n", - " \"HOLOSCAN_CONFIG_PATH\": \"/var/holoscan/app.yaml\",\n", - " \"HOLOSCAN_APP_MANIFEST_PATH\": \"/etc/holoscan/app.json\",\n", - " \"HOLOSCAN_PKG_MANIFEST_PATH\": \"/etc/holoscan/pkg.json\",\n", - " \"HOLOSCAN_DOCS_PATH\": \"/opt/holoscan/docs\",\n", - " \"HOLOSCAN_LOGS_PATH\": \"/var/holoscan/logs\"\n", - " },\n", - " \"input\": {\n", - " \"path\": \"input/\",\n", - " \"formats\": null\n", - " },\n", - " \"liveness\": null,\n", - " \"output\": {\n", - " \"path\": \"output/\",\n", - " \"formats\": null\n", - " },\n", - " \"readiness\": null,\n", - " \"sdk\": \"monai-deploy\",\n", - " \"sdkVersion\": \"1.0.0\",\n", - " \"timeout\": 0,\n", - " \"version\": 1.0,\n", - " \"workingDirectory\": \"/var/holoscan\"\n", - "}\n", - "================ End app.json ================\n", - " \n", - "[2026-01-29 19:20:26,825] [DEBUG] (common) - \n", - "=============== Begin pkg.json ===============\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"applicationRoot\": \"/opt/holoscan/app\",\n", - " \"modelRoot\": \"/opt/holoscan/models\",\n", - " \"models\": {},\n", - " \"resources\": {\n", - " \"cpu\": 1,\n", - " \"gpu\": 1,\n", - " \"memory\": \"1Gi\",\n", - " \"gpuMemory\": \"1Gi\"\n", - " },\n", - " \"version\": 1.0,\n", - " \"platformConfig\": \"dgpu\"\n", - "}\n", - "================ End pkg.json ================\n", - " \n", - "[2026-01-29 19:20:26,827] [DEBUG] (packager.builder) - ================ Begin requirements.txt ================\n", - "[2026-01-29 19:20:26,827] [DEBUG] (packager.builder) - scikit-image\n", - "[2026-01-29 19:20:26,827] [DEBUG] (packager.builder) - setuptools>=59.5.0 # for pkg_resources\n", - "[2026-01-29 19:20:26,827] [DEBUG] (packager.builder) - \n", - "[2026-01-29 19:20:26,828] [DEBUG] (packager.builder) - ================ End requirements.txt ==================\n", - "[2026-01-29 19:20:26,828] [DEBUG] (packager.builder) - \n", - "========== Begin Build Parameters ==========\n", - "{'add_hosts': None,\n", - " 'additional_lib_paths': '',\n", - " 'app_config_file_path': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/simple_imaging_app/app.yaml'),\n", - " 'app_dir': PosixPath('/opt/holoscan/app'),\n", - " 'app_json': '/etc/holoscan/app.json',\n", - " 'application': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/simple_imaging_app'),\n", - " 'application_directory': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/simple_imaging_app'),\n", - " 'application_type': 'PythonModule',\n", - " 'build_cache': PosixPath('/home/mqin/.holoscan_build_cache'),\n", - " 'cmake_args': '',\n", - " 'command': '[\"python3\", \"/opt/holoscan/app\"]',\n", - " 'command_filename': 'simple_imaging_app',\n", - " 'config_file_path': PosixPath('/var/holoscan/app.yaml'),\n", - " 'docs_dir': PosixPath('/opt/holoscan/docs'),\n", - " 'full_input_path': PosixPath('/var/holoscan/input'),\n", - " 'full_output_path': PosixPath('/var/holoscan/output'),\n", - " 'gid': 1000,\n", - " 'holoscan_sdk_version': '3.10.0',\n", - " 'includes': [],\n", - " 'input_data': None,\n", - " 'input_dir': 'input/',\n", - " 'lib_dir': PosixPath('/opt/holoscan/lib'),\n", - " 'logs_dir': PosixPath('/var/holoscan/logs'),\n", - " 'models_dir': PosixPath('/opt/holoscan/models'),\n", - " 'monai_deploy_app_sdk_version': '1.0.0',\n", - " 'no_cache': False,\n", - " 'output_dir': 'output/',\n", - " 'pip_packages': None,\n", - " 'pkg_json': '/etc/holoscan/pkg.json',\n", - " 'requirements_file_path': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/simple_imaging_app/requirements.txt'),\n", - " 'sdk': ,\n", - " 'sdk_type': 'monai-deploy',\n", - " 'tarball_output': None,\n", - " 'timeout': 0,\n", - " 'title': 'MONAI Deploy App Package - Simple Imaging App',\n", - " 'uid': 1000,\n", - " 'username': 'holoscan',\n", - " 'version': 1.0,\n", - " 'working_dir': PosixPath('/var/holoscan')}\n", - "=========== End Build Parameters ===========\n", - "\n", - "[2026-01-29 19:20:26,828] [DEBUG] (packager.builder) - \n", - "========== Begin Platform Parameters ==========\n", - "{'base_image': 'nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04',\n", - " 'build_image': None,\n", - " 'cuda_deb_arch': 'x86_64',\n", - " 'cuda_version': 12,\n", - " 'custom_base_image': False,\n", - " 'custom_holoscan_sdk': False,\n", - " 'custom_monai_deploy_sdk': False,\n", - " 'gpu_type': 'dgpu',\n", - " 'holoscan_deb_arch': 'amd64',\n", - " 'holoscan_sdk_file': '3.10.0',\n", - " 'holoscan_sdk_filename': '3.10.0',\n", - " 'monai_deploy_sdk_file': None,\n", - " 'monai_deploy_sdk_filename': None,\n", - " 'tag': 'simple_imaging_app:1.0',\n", - " 'target_arch': 'x86_64'}\n", - "=========== End Platform Parameters ===========\n", - "\n", - "[2026-01-29 19:20:26,842] [DEBUG] (packager.builder) - \n", - "========== Begin Dockerfile ==========\n", - "# SPDX-FileCopyrightText: Copyright (c) 2023-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n", - "# SPDX-License-Identifier: Apache-2.0\n", - "#\n", - "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "# you may not use this file except in compliance with the License.\n", - "# You may obtain a copy of the License at\n", - "#\n", - "# http://www.apache.org/licenses/LICENSE-2.0\n", - "#\n", - "# Unless required by applicable law or agreed to in writing, software\n", - "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", - "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", - "# See the License for the specific language governing permissions and\n", - "# limitations under the License.\n", - "\n", - "ARG GPU_TYPE=dgpu\n", - "ARG LIBTORCH_VERSION=2.8.0\n", - "ARG LIBTORCH_VISION_VERSION=\"0.23.0\"\n", - "\n", - "\n", - "\n", - "\n", - "FROM nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04 AS base\n", - "\n", - "RUN apt-get update \\\n", - " && apt-get install -y --no-install-recommends --no-install-suggests \\\n", - " curl \\\n", - " jq \\\n", - " && rm -rf /var/lib/apt/lists/*\n", - "\n", - "\n", - "FROM base AS release\n", - "ENV DEBIAN_FRONTEND=noninteractive\n", - "ENV TERM=xterm-256color\n", - "\n", - "ARG GPU_TYPE\n", - "ARG UNAME\n", - "ARG UID\n", - "ARG GID\n", - "ARG LIBTORCH_VERSION\n", - "ARG LIBTORCH_VISION_VERSION\n", - "\n", - "RUN mkdir -p /etc/holoscan/ \\\n", - " && mkdir -p /opt/holoscan/ \\\n", - " && mkdir -p /var/holoscan \\\n", - " && mkdir -p /opt/holoscan/app \\\n", - " && mkdir -p /var/holoscan/input \\\n", - " && mkdir -p /var/holoscan/output\n", - "\n", - "LABEL base=\"nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04\"\n", - "LABEL tag=\"simple_imaging_app:1.0\"\n", - "LABEL org.opencontainers.image.title=\"MONAI Deploy App Package - Simple Imaging App\"\n", - "LABEL org.opencontainers.image.version=\"1.0\"\n", - "LABEL org.nvidia.holoscan=\"3.10.0\"\n", - "\n", - "LABEL org.monai.deploy.app-sdk=\"1.0.0\"\n", - "\n", - "ENV HOLOSCAN_INPUT_PATH=/var/holoscan/input\n", - "ENV HOLOSCAN_OUTPUT_PATH=/var/holoscan/output\n", - "ENV HOLOSCAN_WORKDIR=/var/holoscan\n", - "ENV HOLOSCAN_APPLICATION=/opt/holoscan/app\n", - "ENV HOLOSCAN_TIMEOUT=0\n", - "ENV HOLOSCAN_MODEL_PATH=/opt/holoscan/models\n", - "ENV HOLOSCAN_DOCS_PATH=/opt/holoscan/docs\n", - "ENV HOLOSCAN_CONFIG_PATH=/var/holoscan/app.yaml\n", - "ENV HOLOSCAN_APP_MANIFEST_PATH=/etc/holoscan/app.json\n", - "ENV HOLOSCAN_PKG_MANIFEST_PATH=/etc/holoscan/pkg.json\n", - "ENV HOLOSCAN_LOGS_PATH=/var/holoscan/logs\n", - "ENV HOLOSCAN_VERSION=3.10.0\n", - "\n", - "# Update NV GPG repo key\n", - "# https://developer.nvidia.com/blog/updating-the-cuda-linux-gpg-repository-key/\n", - "RUN rm -f /etc/apt/sources.list.d/cuda*.list \\\n", - " && curl -OL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb \\\n", - " && dpkg -i cuda-keyring_1.1-1_all.deb \\\n", - " && rm -f cuda-keyring_1.1-1_all.deb \\\n", - " && apt-get update\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "# If torch is installed, we can skip installing Python\n", - "ENV PYTHON_VERSION=3.12.3-*\n", - "ENV PYTHON_PIP_VERSION=24.0+dfsg-*\n", - "\n", - "RUN apt update \\\n", - " && apt-get install -y --no-install-recommends --no-install-suggests \\\n", - " python3-minimal=${PYTHON_VERSION} \\\n", - " libpython3-stdlib=${PYTHON_VERSION} \\\n", - " python3=${PYTHON_VERSION} \\\n", - " python3-venv=${PYTHON_VERSION} \\\n", - " python3-pip=${PYTHON_PIP_VERSION} \\\n", - " && rm -rf /var/lib/apt/lists/*\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "RUN if id \"ubuntu\" >/dev/null 2>&1; then touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu; fi\n", - "RUN groupadd -f -g $GID $UNAME\n", - "RUN useradd -rm -d /home/$UNAME -s /bin/bash -g $GID -G sudo -u $UID $UNAME\n", - "RUN chown -R holoscan /var/holoscan && \\\n", - " chown -R holoscan /var/holoscan/input && \\\n", - " chown -R holoscan /var/holoscan/output\n", - "\n", - "# Set the working directory\n", - "WORKDIR /var/holoscan\n", - "\n", - "# Copy HAP/MAP tool script\n", - "COPY ./tools /var/holoscan/tools\n", - "RUN chmod +x /var/holoscan/tools\n", - "\n", - "# Remove EXTERNALLY-MANAGED directory\n", - "RUN rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED\n", - "\n", - "# Set the working directory\n", - "WORKDIR /var/holoscan\n", - "\n", - "USER $UNAME\n", - "\n", - "ENV PATH=/home/${UNAME}/.local/bin:/opt/nvidia/holoscan/bin:$PATH\n", - "ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/${UNAME}/.local/lib/python3.12/site-packages/holoscan/lib\n", - "\n", - "COPY ./pip/requirements.txt /tmp/requirements.txt\n", - "\n", - "RUN pip install --upgrade pip\n", - "RUN pip install --no-cache-dir --user -r /tmp/requirements.txt\n", - "\n", - "\n", - "# Install MONAI Deploy App SDK\n", - "\n", - "# Install MONAI Deploy from PyPI org\n", - "RUN pip install monai-deploy-app-sdk==1.0.0\n", - "\n", - "\n", - "\n", - "\n", - "COPY ./map/app.json /etc/holoscan/app.json\n", - "COPY ./app.config /var/holoscan/app.yaml\n", - "COPY ./map/pkg.json /etc/holoscan/pkg.json\n", - "\n", - "COPY ./app /opt/holoscan/app\n", - "\n", - "\n", - "\n", - "ENTRYPOINT [\"/var/holoscan/tools\"]\n", - "=========== End Dockerfile ===========\n", - "\n", - "[2026-01-29 19:20:26,843] [DEBUG] (python_on_whales.utils) - Running command: /usr/bin/docker buildx ls --format '{{json . }}'\n", - "[2026-01-29 19:20:27,386] [INFO] (common) - Using existing Docker BuildKit builder `holoscan_app_builder`\n", - "[2026-01-29 19:20:27,386] [DEBUG] (packager.builder) - Building Holoscan Application Package: tag=simple_imaging_app-x64-workstation-dgpu-linux-amd64:1.0\n", - "[2026-01-29 19:20:27,386] [INFO] (packager.builder) - \n", - "===============================================================================\n", - "Building image for: x64-workstation\n", - " Architecture: linux/amd64\n", - " Base Image: nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04\n", - " Build Image: N/A\n", - " CUDA Version: 12\n", - " Cache: Enabled\n", - " Configuration: dgpu\n", - " Holoscan SDK Package: 3.10.0\n", - " MONAI Deploy App SDK Package: N/A\n", - " gRPC Health Probe: N/A\n", - " SDK Version: 3.10.0\n", - " SDK: monai-deploy\n", - " Tag: simple_imaging_app-x64-workstation-dgpu-linux-amd64:1.0\n", - " Included features/dependencies: N/A\n", - " \n", - "[2026-01-29 19:20:27,387] [DEBUG] (python_on_whales.utils) - Running command: /usr/bin/docker buildx inspect holoscan_app_builder\n", - "[2026-01-29 19:20:27,585] [DEBUG] (python_on_whales.utils) - Running command: /usr/bin/docker buildx ls --format '{{json . }}'\n", - "[2026-01-29 19:20:27,816] [DEBUG] (python_on_whales.utils) - Running command: /usr/bin/docker buildx build --progress plain --build-arg UID=1000 --build-arg GID=1000 --build-arg UNAME=holoscan --build-arg GPU_TYPE=dgpu --builder holoscan_app_builder --pull --load --file /tmp/holoscan_tmpoqhk5myh/Dockerfile --cache-from type=local,src=/home/mqin/.holoscan_build_cache --cache-from type=registry,ref=nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04 --cache-to type=local,dest=/home/mqin/.holoscan_build_cache --platform linux/amd64 --tag simple_imaging_app-x64-workstation-dgpu-linux-amd64:1.0 /tmp/holoscan_tmpoqhk5myh\n", - "#0 building with \"holoscan_app_builder\" instance using docker-container driver\n", - "\n", - "#1 [internal] load build definition from Dockerfile\n", - "#1 transferring dockerfile: 4.37kB done\n", - "#1 DONE 0.1s\n", - "\n", - "#2 [auth] nvidia/cuda:pull token for nvcr.io\n", - "#2 DONE 0.0s\n", - "\n", - "#3 [internal] load metadata for nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04\n", - "#3 DONE 1.2s\n", - "\n", - "#4 [internal] load .dockerignore\n", - "#4 transferring context: 1.80kB done\n", - "#4 DONE 0.1s\n", - "\n", - "#5 importing cache manifest from nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04\n", - "#5 ...\n", - "\n", - "#6 [internal] load build context\n", - "#6 DONE 0.0s\n", - "\n", - "#7 importing cache manifest from local:3401805038315922218\n", - "#7 inferred cache manifest type: application/vnd.oci.image.index.v1+json done\n", - "#7 DONE 0.0s\n", - "\n", - "#8 [base 1/2] FROM nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04@sha256:ebef3c171eeef0298e4eb2e4be843105edf3b8b0ac45e0b43acee358e8046867\n", - "#8 resolve nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04@sha256:ebef3c171eeef0298e4eb2e4be843105edf3b8b0ac45e0b43acee358e8046867 0.0s done\n", - "#8 DONE 0.0s\n", - "\n", - "#5 importing cache manifest from nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04\n", - "#5 inferred cache manifest type: application/vnd.docker.distribution.manifest.list.v2+json done\n", - "#5 DONE 0.5s\n", - "\n", - "#6 [internal] load build context\n", - "#6 transferring context: 24.87kB done\n", - "#6 DONE 0.1s\n", - "\n", - "#8 [base 1/2] FROM nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04@sha256:ebef3c171eeef0298e4eb2e4be843105edf3b8b0ac45e0b43acee358e8046867\n", - "#8 DONE 0.5s\n", - "\n", - "#8 [base 1/2] FROM nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04@sha256:ebef3c171eeef0298e4eb2e4be843105edf3b8b0ac45e0b43acee358e8046867\n", - "#8 sha256:7209097bfb98d6f8b422984480f1fddead5ea62f8900ff6b6548e060b71aca76 1.68kB / 1.68kB 0.1s done\n", - "#8 sha256:545a3ada5b6bc612a11c13a659775d67eeda5a61615e7f49c76ecd24adcad626 1.52kB / 1.52kB 0.1s done\n", - "#8 sha256:3d6ab8c799cda2f4c6a6277b0e24dd2231c5de83b0316968b7cce81156bb8be0 59.62kB / 59.62kB 0.1s done\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 4.19MB / 2.06GB 0.2s\n", - "#8 sha256:73389fbd088f5ed5d9fd258baced59de092978b4f483920ea6d074522a105119 6.88kB / 6.88kB 0.0s done\n", - "#8 sha256:398182656c471d6ecca3c2d6d30e97193b40ffc8028a94515093960322f3d64e 183B / 183B 0.0s done\n", - "#8 sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 1.05MB / 64.29MB 0.2s\n", - "#8 sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 5.24MB / 64.29MB 0.3s\n", - "#8 sha256:a102f36d092c0e9e0bef8c97854f606af9156aa36ab408e6fa4b88e27124a7e6 0B / 6.95MB 0.2s\n", - "#8 sha256:5a7813e071bfadf18aaa6ca8318be4824a9b6297b3240f2cc84c1db6f4113040 0B / 29.75MB 0.2s\n", - "#8 sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 10.49MB / 64.29MB 0.5s\n", - "#8 sha256:a102f36d092c0e9e0bef8c97854f606af9156aa36ab408e6fa4b88e27124a7e6 2.10MB / 6.95MB 0.3s\n", - "#8 sha256:5a7813e071bfadf18aaa6ca8318be4824a9b6297b3240f2cc84c1db6f4113040 2.19MB / 29.75MB 0.3s\n", - "#8 sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 15.04MB / 64.29MB 0.6s\n", - "#8 sha256:a102f36d092c0e9e0bef8c97854f606af9156aa36ab408e6fa4b88e27124a7e6 3.15MB / 6.95MB 0.5s\n", - "#8 sha256:5a7813e071bfadf18aaa6ca8318be4824a9b6297b3240f2cc84c1db6f4113040 9.44MB / 29.75MB 0.5s\n", - "#8 sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 19.92MB / 64.29MB 0.8s\n", - "#8 sha256:a102f36d092c0e9e0bef8c97854f606af9156aa36ab408e6fa4b88e27124a7e6 5.24MB / 6.95MB 0.6s\n", - "#8 sha256:5a7813e071bfadf18aaa6ca8318be4824a9b6297b3240f2cc84c1db6f4113040 13.63MB / 29.75MB 0.6s\n", - "#8 sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 25.17MB / 64.29MB 0.9s\n", - "#8 sha256:a102f36d092c0e9e0bef8c97854f606af9156aa36ab408e6fa4b88e27124a7e6 6.95MB / 6.95MB 0.7s done\n", - "#8 sha256:5a7813e071bfadf18aaa6ca8318be4824a9b6297b3240f2cc84c1db6f4113040 18.87MB / 29.75MB 0.8s\n", - "#8 sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 29.36MB / 64.29MB 1.1s\n", - "#8 sha256:5a7813e071bfadf18aaa6ca8318be4824a9b6297b3240f2cc84c1db6f4113040 24.12MB / 29.75MB 0.9s\n", - "#8 sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 34.60MB / 64.29MB 1.2s\n", - "#8 sha256:5a7813e071bfadf18aaa6ca8318be4824a9b6297b3240f2cc84c1db6f4113040 28.31MB / 29.75MB 1.1s\n", - "#8 sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 41.94MB / 64.29MB 1.4s\n", - "#8 sha256:5a7813e071bfadf18aaa6ca8318be4824a9b6297b3240f2cc84c1db6f4113040 29.75MB / 29.75MB 1.2s done\n", - "#8 extracting sha256:5a7813e071bfadf18aaa6ca8318be4824a9b6297b3240f2cc84c1db6f4113040\n", - "#8 sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 49.28MB / 64.29MB 1.5s\n", - "#8 sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 57.03MB / 64.29MB 1.7s\n", - "#8 sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 64.29MB / 64.29MB 1.8s\n", - "#8 sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 64.29MB / 64.29MB 1.9s done\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 130.02MB / 2.06GB 2.3s\n", - "#8 extracting sha256:5a7813e071bfadf18aaa6ca8318be4824a9b6297b3240f2cc84c1db6f4113040 1.7s done\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 245.37MB / 2.06GB 3.3s\n", - "#8 extracting sha256:a102f36d092c0e9e0bef8c97854f606af9156aa36ab408e6fa4b88e27124a7e6\n", - "#8 extracting sha256:a102f36d092c0e9e0bef8c97854f606af9156aa36ab408e6fa4b88e27124a7e6 0.4s done\n", - "#8 extracting sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 360.71MB / 2.06GB 4.4s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 475.00MB / 2.06GB 5.4s\n", - "#8 extracting sha256:05ec76e31584ec109785cc7045bd88df0240411233c2fcdad66b621c662034c0 2.3s done\n", - "#8 extracting sha256:398182656c471d6ecca3c2d6d30e97193b40ffc8028a94515093960322f3d64e 0.0s done\n", - "#8 extracting sha256:73389fbd088f5ed5d9fd258baced59de092978b4f483920ea6d074522a105119 0.0s done\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 592.45MB / 2.06GB 6.5s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 708.84MB / 2.06GB 7.5s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 823.13MB / 2.06GB 8.6s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 937.43MB / 2.06GB 9.6s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 1.04GB / 2.06GB 10.8s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 1.16GB / 2.06GB 11.9s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 1.27GB / 2.06GB 12.9s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 1.39GB / 2.06GB 14.0s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 1.51GB / 2.06GB 15.0s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 1.62GB / 2.06GB 16.1s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 1.74GB / 2.06GB 17.1s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 1.85GB / 2.06GB 18.2s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 1.97GB / 2.06GB 19.2s\n", - "#8 sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 2.06GB / 2.06GB 21.9s done\n", - "#8 extracting sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053\n", - "#8 extracting sha256:cbb9175a9bc5f6553f8c0c5025ea9521898b8a3956ee24798dc35c24c6185053 34.5s done\n", - "#8 DONE 57.1s\n", - "\n", - "#8 [base 1/2] FROM nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04@sha256:ebef3c171eeef0298e4eb2e4be843105edf3b8b0ac45e0b43acee358e8046867\n", - "#8 extracting sha256:3d6ab8c799cda2f4c6a6277b0e24dd2231c5de83b0316968b7cce81156bb8be0 0.0s done\n", - "#8 extracting sha256:7209097bfb98d6f8b422984480f1fddead5ea62f8900ff6b6548e060b71aca76 0.0s done\n", - "#8 extracting sha256:545a3ada5b6bc612a11c13a659775d67eeda5a61615e7f49c76ecd24adcad626 0.0s done\n", - "#8 DONE 57.2s\n", - "\n", - "#9 [base 2/2] RUN apt-get update && apt-get install -y --no-install-recommends --no-install-suggests curl jq && rm -rf /var/lib/apt/lists/*\n", - "#9 0.286 Get:1 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 InRelease [1581 B]\n", - "#9 0.409 Get:2 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]\n", - "#9 0.521 Get:3 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]\n", - "#9 0.638 Get:4 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 Packages [1185 kB]\n", - "#9 0.829 Get:5 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]\n", - "#9 0.932 Get:6 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]\n", - "#9 1.045 Get:7 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]\n", - "#9 1.512 Get:8 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [1776 kB]\n", - "#9 1.817 Get:9 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]\n", - "#9 1.820 Get:10 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1808 kB]\n", - "#9 1.950 Get:11 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]\n", - "#9 1.957 Get:12 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [1975 kB]\n", - "#9 2.046 Get:13 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [3219 kB]\n", - "#9 2.181 Get:14 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [2171 kB]\n", - "#9 2.206 Get:15 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [3008 kB]\n", - "#9 2.250 Get:16 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Packages [38.1 kB]\n", - "#9 2.252 Get:17 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [34.6 kB]\n", - "#9 2.253 Get:18 http://archive.ubuntu.com/ubuntu noble-backports/main amd64 Packages [49.5 kB]\n", - "#9 2.398 Get:19 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [1194 kB]\n", - "#9 2.445 Get:20 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Packages [34.8 kB]\n", - "#9 3.196 Fetched 36.9 MB in 3s (12.5 MB/s)\n", - "#9 3.196 Reading package lists...\n", - "#9 4.109 W: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.\n", - "#9 4.123 Reading package lists...\n", - "#9 5.026 Building dependency tree...\n", - "#9 5.226 Reading state information...\n", - "#9 5.495 The following additional packages will be installed:\n", - "#9 5.495 libbrotli1 libcurl4t64 libgssapi-krb5-2 libjq1 libk5crypto3 libkeyutils1\n", - "#9 5.496 libkrb5-3 libkrb5support0 libnghttp2-14 libonig5 libpsl5t64 librtmp1\n", - "#9 5.497 libssh-4\n", - "#9 5.498 Suggested packages:\n", - "#9 5.498 krb5-doc krb5-user\n", - "#9 5.498 Recommended packages:\n", - "#9 5.498 krb5-locales publicsuffix\n", - "#9 5.555 The following NEW packages will be installed:\n", - "#9 5.556 curl jq libbrotli1 libcurl4t64 libgssapi-krb5-2 libjq1 libk5crypto3\n", - "#9 5.556 libkeyutils1 libkrb5-3 libkrb5support0 libnghttp2-14 libonig5 libpsl5t64\n", - "#9 5.558 librtmp1 libssh-4\n", - "#9 5.871 0 upgraded, 15 newly installed, 0 to remove and 51 not upgraded.\n", - "#9 5.871 Need to get 2270 kB of archives.\n", - "#9 5.871 After this operation, 6343 kB of additional disk space will be used.\n", - "#9 5.871 Get:1 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libkrb5support0 amd64 1.20.1-6ubuntu2.6 [34.4 kB]\n", - "#9 6.200 Get:2 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libk5crypto3 amd64 1.20.1-6ubuntu2.6 [82.0 kB]\n", - "#9 6.436 Get:3 http://archive.ubuntu.com/ubuntu noble/main amd64 libkeyutils1 amd64 1.6.3-3build1 [9490 B]\n", - "#9 6.452 Get:4 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libkrb5-3 amd64 1.20.1-6ubuntu2.6 [348 kB]\n", - "#9 6.734 Get:5 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgssapi-krb5-2 amd64 1.20.1-6ubuntu2.6 [143 kB]\n", - "#9 6.787 Get:6 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libnghttp2-14 amd64 1.59.0-1ubuntu0.2 [74.3 kB]\n", - "#9 6.811 Get:7 http://archive.ubuntu.com/ubuntu noble/main amd64 libpsl5t64 amd64 0.21.2-1.1build1 [57.1 kB]\n", - "#9 6.828 Get:8 http://archive.ubuntu.com/ubuntu noble/main amd64 libbrotli1 amd64 1.1.0-2build2 [331 kB]\n", - "#9 6.903 Get:9 http://archive.ubuntu.com/ubuntu noble/main amd64 librtmp1 amd64 2.4+20151223.gitfa8646d.1-2build7 [56.3 kB]\n", - "#9 6.912 Get:10 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libssh-4 amd64 0.10.6-2ubuntu0.2 [188 kB]\n", - "#9 6.940 Get:11 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libcurl4t64 amd64 8.5.0-2ubuntu10.6 [341 kB]\n", - "#9 6.984 Get:12 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 curl amd64 8.5.0-2ubuntu10.6 [226 kB]\n", - "#9 7.011 Get:13 http://archive.ubuntu.com/ubuntu noble/main amd64 libonig5 amd64 6.9.9-1build1 [172 kB]\n", - "#9 7.030 Get:14 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libjq1 amd64 1.7.1-3ubuntu0.24.04.1 [141 kB]\n", - "#9 7.044 Get:15 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 jq amd64 1.7.1-3ubuntu0.24.04.1 [65.7 kB]\n", - "#9 7.208 debconf: delaying package configuration, since apt-utils is not installed\n", - "#9 7.277 Fetched 2270 kB in 1s (1545 kB/s)\n", - "#9 7.341 Selecting previously unselected package libkrb5support0:amd64.\n", - "(Reading database ... 5307 files and directories currently installed.)\n", - "#9 7.357 Preparing to unpack .../00-libkrb5support0_1.20.1-6ubuntu2.6_amd64.deb ...\n", - "#9 7.381 Unpacking libkrb5support0:amd64 (1.20.1-6ubuntu2.6) ...\n", - "#9 7.481 Selecting previously unselected package libk5crypto3:amd64.\n", - "#9 7.484 Preparing to unpack .../01-libk5crypto3_1.20.1-6ubuntu2.6_amd64.deb ...\n", - "#9 7.496 Unpacking libk5crypto3:amd64 (1.20.1-6ubuntu2.6) ...\n", - "#9 7.596 Selecting previously unselected package libkeyutils1:amd64.\n", - "#9 7.599 Preparing to unpack .../02-libkeyutils1_1.6.3-3build1_amd64.deb ...\n", - "#9 7.610 Unpacking libkeyutils1:amd64 (1.6.3-3build1) ...\n", - "#9 7.706 Selecting previously unselected package libkrb5-3:amd64.\n", - "#9 7.708 Preparing to unpack .../03-libkrb5-3_1.20.1-6ubuntu2.6_amd64.deb ...\n", - "#9 7.721 Unpacking libkrb5-3:amd64 (1.20.1-6ubuntu2.6) ...\n", - "#9 7.847 Selecting previously unselected package libgssapi-krb5-2:amd64.\n", - "#9 7.849 Preparing to unpack .../04-libgssapi-krb5-2_1.20.1-6ubuntu2.6_amd64.deb ...\n", - "#9 7.862 Unpacking libgssapi-krb5-2:amd64 (1.20.1-6ubuntu2.6) ...\n", - "#9 7.969 Selecting previously unselected package libnghttp2-14:amd64.\n", - "#9 7.971 Preparing to unpack .../05-libnghttp2-14_1.59.0-1ubuntu0.2_amd64.deb ...\n", - "#9 7.983 Unpacking libnghttp2-14:amd64 (1.59.0-1ubuntu0.2) ...\n", - "#9 8.089 Selecting previously unselected package libpsl5t64:amd64.\n", - "#9 8.091 Preparing to unpack .../06-libpsl5t64_0.21.2-1.1build1_amd64.deb ...\n", - "#9 8.104 Unpacking libpsl5t64:amd64 (0.21.2-1.1build1) ...\n", - "#9 8.205 Selecting previously unselected package libbrotli1:amd64.\n", - "#9 8.208 Preparing to unpack .../07-libbrotli1_1.1.0-2build2_amd64.deb ...\n", - "#9 8.220 Unpacking libbrotli1:amd64 (1.1.0-2build2) ...\n", - "#9 8.332 Selecting previously unselected package librtmp1:amd64.\n", - "#9 8.334 Preparing to unpack .../08-librtmp1_2.4+20151223.gitfa8646d.1-2build7_amd64.deb ...\n", - "#9 8.346 Unpacking librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2build7) ...\n", - "#9 8.448 Selecting previously unselected package libssh-4:amd64.\n", - "#9 8.450 Preparing to unpack .../09-libssh-4_0.10.6-2ubuntu0.2_amd64.deb ...\n", - "#9 8.462 Unpacking libssh-4:amd64 (0.10.6-2ubuntu0.2) ...\n", - "#9 8.569 Selecting previously unselected package libcurl4t64:amd64.\n", - "#9 8.571 Preparing to unpack .../10-libcurl4t64_8.5.0-2ubuntu10.6_amd64.deb ...\n", - "#9 8.583 Unpacking libcurl4t64:amd64 (8.5.0-2ubuntu10.6) ...\n", - "#9 8.677 Selecting previously unselected package curl.\n", - "#9 8.680 Preparing to unpack .../11-curl_8.5.0-2ubuntu10.6_amd64.deb ...\n", - "#9 8.692 Unpacking curl (8.5.0-2ubuntu10.6) ...\n", - "#9 8.797 Selecting previously unselected package libonig5:amd64.\n", - "#9 8.799 Preparing to unpack .../12-libonig5_6.9.9-1build1_amd64.deb ...\n", - "#9 8.811 Unpacking libonig5:amd64 (6.9.9-1build1) ...\n", - "#9 8.919 Selecting previously unselected package libjq1:amd64.\n", - "#9 8.921 Preparing to unpack .../13-libjq1_1.7.1-3ubuntu0.24.04.1_amd64.deb ...\n", - "#9 8.934 Unpacking libjq1:amd64 (1.7.1-3ubuntu0.24.04.1) ...\n", - "#9 9.020 Selecting previously unselected package jq.\n", - "#9 9.023 Preparing to unpack .../14-jq_1.7.1-3ubuntu0.24.04.1_amd64.deb ...\n", - "#9 9.035 Unpacking jq (1.7.1-3ubuntu0.24.04.1) ...\n", - "#9 9.137 Setting up libkeyutils1:amd64 (1.6.3-3build1) ...\n", - "#9 9.173 Setting up libbrotli1:amd64 (1.1.0-2build2) ...\n", - "#9 9.208 Setting up libpsl5t64:amd64 (0.21.2-1.1build1) ...\n", - "#9 9.242 Setting up libnghttp2-14:amd64 (1.59.0-1ubuntu0.2) ...\n", - "#9 9.277 Setting up libkrb5support0:amd64 (1.20.1-6ubuntu2.6) ...\n", - "#9 9.311 Setting up librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2build7) ...\n", - "#9 9.345 Setting up libk5crypto3:amd64 (1.20.1-6ubuntu2.6) ...\n", - "#9 9.379 Setting up libkrb5-3:amd64 (1.20.1-6ubuntu2.6) ...\n", - "#9 9.414 Setting up libonig5:amd64 (6.9.9-1build1) ...\n", - "#9 9.449 Setting up libjq1:amd64 (1.7.1-3ubuntu0.24.04.1) ...\n", - "#9 9.484 Setting up libgssapi-krb5-2:amd64 (1.20.1-6ubuntu2.6) ...\n", - "#9 9.521 Setting up libssh-4:amd64 (0.10.6-2ubuntu0.2) ...\n", - "#9 9.555 Setting up jq (1.7.1-3ubuntu0.24.04.1) ...\n", - "#9 9.589 Setting up libcurl4t64:amd64 (8.5.0-2ubuntu10.6) ...\n", - "#9 9.623 Setting up curl (8.5.0-2ubuntu10.6) ...\n", - "#9 9.658 Processing triggers for libc-bin (2.39-0ubuntu8.3) ...\n", - "#9 DONE 11.3s\n", - "\n", - "#10 [release 1/20] RUN mkdir -p /etc/holoscan/ && mkdir -p /opt/holoscan/ && mkdir -p /var/holoscan && mkdir -p /opt/holoscan/app && mkdir -p /var/holoscan/input && mkdir -p /var/holoscan/output\n", - "#10 DONE 0.2s\n", - "\n", - "#11 [release 2/20] RUN rm -f /etc/apt/sources.list.d/cuda*.list && curl -OL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb && dpkg -i cuda-keyring_1.1-1_all.deb && rm -f cuda-keyring_1.1-1_all.deb && apt-get update\n", - "#11 0.186 % Total % Received % Xferd Average Speed Time Time Time Current\n", - "#11 0.186 Dload Upload Total Spent Left Speed\n", - "100 4328 100 4328 0 0 92191 0 --:--:-- --:--:-- --:--:-- 94086\n", - "#11 0.295 Selecting previously unselected package cuda-keyring.\n", - "#11 0.309 (Reading database ... 5411 files and directories currently installed.)\n", - "#11 0.310 Preparing to unpack cuda-keyring_1.1-1_all.deb ...\n", - "#11 0.322 Unpacking cuda-keyring (1.1-1) ...\n", - "#11 0.377 Setting up cuda-keyring (1.1-1) ...\n", - "#11 0.638 Get:1 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 InRelease [1581 B]\n", - "#11 0.785 Get:2 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 Packages [1185 kB]\n", - "#11 0.824 Get:3 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]\n", - "#11 0.858 Get:4 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]\n", - "#11 1.555 Get:5 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]\n", - "#11 1.665 Get:6 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Packages [34.8 kB]\n", - "#11 1.736 Get:7 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]\n", - "#11 1.850 Get:8 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [1776 kB]\n", - "#11 1.922 Get:9 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]\n", - "#11 2.048 Get:10 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1808 kB]\n", - "#11 2.411 Get:11 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]\n", - "#11 2.418 Get:12 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]\n", - "#11 2.465 Get:13 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [3008 kB]\n", - "#11 2.738 Get:14 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [1194 kB]\n", - "#11 3.325 Get:15 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [1975 kB]\n", - "#11 3.367 Get:16 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Packages [38.1 kB]\n", - "#11 3.368 Get:17 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [3219 kB]\n", - "#11 3.537 Get:18 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [2171 kB]\n", - "#11 3.625 Get:19 http://archive.ubuntu.com/ubuntu noble-backports/main amd64 Packages [49.5 kB]\n", - "#11 3.626 Get:20 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [34.6 kB]\n", - "#11 4.382 Fetched 36.9 MB in 4s (9616 kB/s)\n", - "#11 4.382 Reading package lists...\n", - "#11 DONE 5.4s\n", - "\n", - "#12 [release 3/20] RUN apt update && apt-get install -y --no-install-recommends --no-install-suggests python3-minimal=3.12.3-* libpython3-stdlib=3.12.3-* python3=3.12.3-* python3-venv=3.12.3-* python3-pip=24.0+dfsg-* && rm -rf /var/lib/apt/lists/*\n", - "#12 0.176 \n", - "#12 0.176 WARNING: apt does not have a stable CLI interface. Use with caution in scripts.\n", - "#12 0.176 \n", - "#12 0.305 Hit:1 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 InRelease\n", - "#12 0.398 Hit:2 http://security.ubuntu.com/ubuntu noble-security InRelease\n", - "#12 0.563 Hit:3 http://archive.ubuntu.com/ubuntu noble InRelease\n", - "#12 0.720 Hit:4 http://archive.ubuntu.com/ubuntu noble-updates InRelease\n", - "#12 0.878 Hit:5 http://archive.ubuntu.com/ubuntu noble-backports InRelease\n", - "#12 1.085 Reading package lists...\n", - "#12 2.022 Building dependency tree...\n", - "#12 2.228 Reading state information...\n", - "#12 2.257 51 packages can be upgraded. Run 'apt list --upgradable' to see them.\n", - "#12 2.266 Reading package lists...\n", - "#12 3.194 Building dependency tree...\n", - "#12 3.395 Reading state information...\n", - "#12 3.670 The following additional packages will be installed:\n", - "#12 3.672 libexpat1 libpython3.12-minimal libpython3.12-stdlib media-types netbase\n", - "#12 3.672 python3-pip-whl python3-pkg-resources python3-setuptools\n", - "#12 3.672 python3-setuptools-whl python3-wheel python3.12 python3.12-minimal\n", - "#12 3.672 python3.12-venv tzdata\n", - "#12 3.674 Suggested packages:\n", - "#12 3.674 python3-doc python3-tk python-setuptools-doc python3.12-doc binutils\n", - "#12 3.674 binfmt-support\n", - "#12 3.674 Recommended packages:\n", - "#12 3.674 build-essential python3-dev\n", - "#12 3.775 The following NEW packages will be installed:\n", - "#12 3.776 libexpat1 libpython3-stdlib libpython3.12-minimal libpython3.12-stdlib\n", - "#12 3.777 media-types netbase python3 python3-minimal python3-pip python3-pip-whl\n", - "#12 3.777 python3-pkg-resources python3-setuptools python3-setuptools-whl python3-venv\n", - "#12 3.777 python3-wheel python3.12 python3.12-minimal python3.12-venv tzdata\n", - "#12 4.134 0 upgraded, 19 newly installed, 0 to remove and 51 not upgraded.\n", - "#12 4.134 Need to get 10.7 MB of archives.\n", - "#12 4.134 After this operation, 38.7 MB of additional disk space will be used.\n", - "#12 4.134 Get:1 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpython3.12-minimal amd64 3.12.3-1ubuntu0.10 [836 kB]\n", - "#12 5.295 Get:2 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libexpat1 amd64 2.6.1-2ubuntu0.3 [88.0 kB]\n", - "#12 5.314 Get:3 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3.12-minimal amd64 3.12.3-1ubuntu0.10 [2335 kB]\n", - "#12 5.782 Get:4 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-minimal amd64 3.12.3-0ubuntu2.1 [27.4 kB]\n", - "#12 5.785 Get:5 http://archive.ubuntu.com/ubuntu noble/main amd64 media-types all 10.1.0 [27.5 kB]\n", - "#12 5.790 Get:6 http://archive.ubuntu.com/ubuntu noble/main amd64 netbase all 6.4 [13.1 kB]\n", - "#12 5.792 Get:7 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 tzdata all 2025b-0ubuntu0.24.04.1 [276 kB]\n", - "#12 5.816 Get:8 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpython3.12-stdlib amd64 3.12.3-1ubuntu0.10 [2069 kB]\n", - "#12 6.144 Get:9 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3.12 amd64 3.12.3-1ubuntu0.10 [651 kB]\n", - "#12 6.176 Get:10 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpython3-stdlib amd64 3.12.3-0ubuntu2.1 [10.1 kB]\n", - "#12 6.176 Get:11 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3 amd64 3.12.3-0ubuntu2.1 [23.0 kB]\n", - "#12 6.177 Get:12 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-pkg-resources all 68.1.2-2ubuntu1.2 [168 kB]\n", - "#12 6.180 Get:13 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-setuptools all 68.1.2-2ubuntu1.2 [397 kB]\n", - "#12 6.354 Get:14 http://archive.ubuntu.com/ubuntu noble/universe amd64 python3-wheel all 0.42.0-2 [53.1 kB]\n", - "#12 6.374 Get:15 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 python3-pip all 24.0+dfsg-1ubuntu1.3 [1320 kB]\n", - "#12 6.416 Get:16 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 python3-pip-whl all 24.0+dfsg-1ubuntu1.3 [1707 kB]\n", - "#12 6.532 Get:17 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 python3-setuptools-whl all 68.1.2-2ubuntu1.2 [716 kB]\n", - "#12 6.579 Get:18 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 python3.12-venv amd64 3.12.3-1ubuntu0.10 [5678 B]\n", - "#12 6.579 Get:19 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 python3-venv amd64 3.12.3-0ubuntu2.1 [1032 B]\n", - "#12 6.748 debconf: delaying package configuration, since apt-utils is not installed\n", - "#12 6.820 Fetched 10.7 MB in 3s (3857 kB/s)\n", - "#12 6.897 Selecting previously unselected package libpython3.12-minimal:amd64.\n", - "(Reading database ... 5416 files and directories currently installed.)\n", - "#12 6.912 Preparing to unpack .../libpython3.12-minimal_3.12.3-1ubuntu0.10_amd64.deb ...\n", - "#12 6.923 Unpacking libpython3.12-minimal:amd64 (3.12.3-1ubuntu0.10) ...\n", - "#12 7.088 Selecting previously unselected package libexpat1:amd64.\n", - "#12 7.090 Preparing to unpack .../libexpat1_2.6.1-2ubuntu0.3_amd64.deb ...\n", - "#12 7.113 Unpacking libexpat1:amd64 (2.6.1-2ubuntu0.3) ...\n", - "#12 7.221 Selecting previously unselected package python3.12-minimal.\n", - "#12 7.223 Preparing to unpack .../python3.12-minimal_3.12.3-1ubuntu0.10_amd64.deb ...\n", - "#12 7.241 Unpacking python3.12-minimal (3.12.3-1ubuntu0.10) ...\n", - "#12 7.427 Setting up libpython3.12-minimal:amd64 (3.12.3-1ubuntu0.10) ...\n", - "#12 7.474 Setting up libexpat1:amd64 (2.6.1-2ubuntu0.3) ...\n", - "#12 7.508 Setting up python3.12-minimal (3.12.3-1ubuntu0.10) ...\n", - "#12 8.299 Selecting previously unselected package python3-minimal.\n", - "(Reading database ... 5735 files and directories currently installed.)\n", - "#12 8.313 Preparing to unpack .../0-python3-minimal_3.12.3-0ubuntu2.1_amd64.deb ...\n", - "#12 8.318 Unpacking python3-minimal (3.12.3-0ubuntu2.1) ...\n", - "#12 8.375 Selecting previously unselected package media-types.\n", - "#12 8.377 Preparing to unpack .../1-media-types_10.1.0_all.deb ...\n", - "#12 8.381 Unpacking media-types (10.1.0) ...\n", - "#12 8.430 Selecting previously unselected package netbase.\n", - "#12 8.433 Preparing to unpack .../2-netbase_6.4_all.deb ...\n", - "#12 8.437 Unpacking netbase (6.4) ...\n", - "#12 8.546 Selecting previously unselected package tzdata.\n", - "#12 8.548 Preparing to unpack .../3-tzdata_2025b-0ubuntu0.24.04.1_all.deb ...\n", - "#12 8.558 Unpacking tzdata (2025b-0ubuntu0.24.04.1) ...\n", - "#12 8.697 Selecting previously unselected package libpython3.12-stdlib:amd64.\n", - "#12 8.699 Preparing to unpack .../4-libpython3.12-stdlib_3.12.3-1ubuntu0.10_amd64.deb ...\n", - "#12 8.711 Unpacking libpython3.12-stdlib:amd64 (3.12.3-1ubuntu0.10) ...\n", - "#12 8.937 Selecting previously unselected package python3.12.\n", - "#12 8.939 Preparing to unpack .../5-python3.12_3.12.3-1ubuntu0.10_amd64.deb ...\n", - "#12 8.952 Unpacking python3.12 (3.12.3-1ubuntu0.10) ...\n", - "#12 9.037 Selecting previously unselected package libpython3-stdlib:amd64.\n", - "#12 9.039 Preparing to unpack .../6-libpython3-stdlib_3.12.3-0ubuntu2.1_amd64.deb ...\n", - "#12 9.051 Unpacking libpython3-stdlib:amd64 (3.12.3-0ubuntu2.1) ...\n", - "#12 9.145 Setting up python3-minimal (3.12.3-0ubuntu2.1) ...\n", - "#12 9.432 Selecting previously unselected package python3.\n", - "(Reading database ... 6705 files and directories currently installed.)\n", - "#12 9.447 Preparing to unpack .../0-python3_3.12.3-0ubuntu2.1_amd64.deb ...\n", - "#12 9.466 Unpacking python3 (3.12.3-0ubuntu2.1) ...\n", - "#12 9.564 Selecting previously unselected package python3-pkg-resources.\n", - "#12 9.567 Preparing to unpack .../1-python3-pkg-resources_68.1.2-2ubuntu1.2_all.deb ...\n", - "#12 9.579 Unpacking python3-pkg-resources (68.1.2-2ubuntu1.2) ...\n", - "#12 9.691 Selecting previously unselected package python3-setuptools.\n", - "#12 9.694 Preparing to unpack .../2-python3-setuptools_68.1.2-2ubuntu1.2_all.deb ...\n", - "#12 9.706 Unpacking python3-setuptools (68.1.2-2ubuntu1.2) ...\n", - "#12 9.843 Selecting previously unselected package python3-wheel.\n", - "#12 9.845 Preparing to unpack .../3-python3-wheel_0.42.0-2_all.deb ...\n", - "#12 9.857 Unpacking python3-wheel (0.42.0-2) ...\n", - "#12 9.963 Selecting previously unselected package python3-pip.\n", - "#12 9.966 Preparing to unpack .../4-python3-pip_24.0+dfsg-1ubuntu1.3_all.deb ...\n", - "#12 9.978 Unpacking python3-pip (24.0+dfsg-1ubuntu1.3) ...\n", - "#12 10.17 Selecting previously unselected package python3-pip-whl.\n", - "#12 10.17 Preparing to unpack .../5-python3-pip-whl_24.0+dfsg-1ubuntu1.3_all.deb ...\n", - "#12 10.18 Unpacking python3-pip-whl (24.0+dfsg-1ubuntu1.3) ...\n", - "#12 10.28 Selecting previously unselected package python3-setuptools-whl.\n", - "#12 10.28 Preparing to unpack .../6-python3-setuptools-whl_68.1.2-2ubuntu1.2_all.deb ...\n", - "#12 10.30 Unpacking python3-setuptools-whl (68.1.2-2ubuntu1.2) ...\n", - "#12 10.40 Selecting previously unselected package python3.12-venv.\n", - "#12 10.40 Preparing to unpack .../7-python3.12-venv_3.12.3-1ubuntu0.10_amd64.deb ...\n", - "#12 10.42 Unpacking python3.12-venv (3.12.3-1ubuntu0.10) ...\n", - "#12 10.50 Selecting previously unselected package python3-venv.\n", - "#12 10.50 Preparing to unpack .../8-python3-venv_3.12.3-0ubuntu2.1_amd64.deb ...\n", - "#12 10.51 Unpacking python3-venv (3.12.3-0ubuntu2.1) ...\n", - "#12 10.61 Setting up media-types (10.1.0) ...\n", - "#12 10.66 Setting up python3-setuptools-whl (68.1.2-2ubuntu1.2) ...\n", - "#12 10.69 Setting up python3-pip-whl (24.0+dfsg-1ubuntu1.3) ...\n", - "#12 10.73 Setting up tzdata (2025b-0ubuntu0.24.04.1) ...\n", - "#12 10.85 \n", - "#12 10.85 Current default time zone: 'Etc/UTC'\n", - "#12 10.85 Local time is now: Fri Jan 30 03:21:54 UTC 2026.\n", - "#12 10.85 Universal Time is now: Fri Jan 30 03:21:54 UTC 2026.\n", - "#12 10.85 Run 'dpkg-reconfigure tzdata' if you wish to change it.\n", - "#12 10.85 \n", - "#12 10.90 Setting up netbase (6.4) ...\n", - "#12 10.98 Setting up libpython3.12-stdlib:amd64 (3.12.3-1ubuntu0.10) ...\n", - "#12 11.02 Setting up python3.12 (3.12.3-1ubuntu0.10) ...\n", - "#12 11.87 Setting up libpython3-stdlib:amd64 (3.12.3-0ubuntu2.1) ...\n", - "#12 11.90 Setting up python3.12-venv (3.12.3-1ubuntu0.10) ...\n", - "#12 12.00 Setting up python3 (3.12.3-0ubuntu2.1) ...\n", - "#12 12.18 Setting up python3-wheel (0.42.0-2) ...\n", - "#12 12.41 Setting up python3-venv (3.12.3-0ubuntu2.1) ...\n", - "#12 12.45 Setting up python3-pkg-resources (68.1.2-2ubuntu1.2) ...\n", - "#12 12.75 Setting up python3-setuptools (68.1.2-2ubuntu1.2) ...\n", - "#12 13.26 Setting up python3-pip (24.0+dfsg-1ubuntu1.3) ...\n", - "#12 14.44 Processing triggers for libc-bin (2.39-0ubuntu8.3) ...\n", - "#12 DONE 14.8s\n", - "\n", - "#13 [release 4/20] RUN if id \"ubuntu\" >/dev/null 2>&1; then touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu; fi\n", - "#13 DONE 0.5s\n", - "\n", - "#14 [release 5/20] RUN groupadd -f -g 1000 holoscan\n", - "#14 DONE 0.3s\n", - "\n", - "#15 [release 6/20] RUN useradd -rm -d /home/holoscan -s /bin/bash -g 1000 -G sudo -u 1000 holoscan\n", - "#15 0.239 useradd warning: holoscan's uid 1000 is greater than SYS_UID_MAX 999\n", - "#15 DONE 0.4s\n", - "\n", - "#16 [release 7/20] RUN chown -R holoscan /var/holoscan && chown -R holoscan /var/holoscan/input && chown -R holoscan /var/holoscan/output\n", - "#16 DONE 0.2s\n", - "\n", - "#17 [release 8/20] WORKDIR /var/holoscan\n", - "#17 DONE 0.1s\n", - "\n", - "#18 [release 9/20] COPY ./tools /var/holoscan/tools\n", - "#18 DONE 0.1s\n", - "\n", - "#19 [release 10/20] RUN chmod +x /var/holoscan/tools\n", - "#19 DONE 0.2s\n", - "\n", - "#20 [release 11/20] RUN rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED\n", - "#20 DONE 0.2s\n", - "\n", - "#21 [release 12/20] WORKDIR /var/holoscan\n", - "#21 DONE 0.1s\n", - "\n", - "#22 [release 13/20] COPY ./pip/requirements.txt /tmp/requirements.txt\n", - "#22 DONE 0.1s\n", - "\n", - "#23 [release 14/20] RUN pip install --upgrade pip\n", - "#23 0.456 Defaulting to user installation because normal site-packages is not writeable\n", - "#23 0.491 Requirement already satisfied: pip in /usr/lib/python3/dist-packages (24.0)\n", - "#23 0.653 Collecting pip\n", - "#23 0.705 Downloading pip-25.3-py3-none-any.whl.metadata (4.7 kB)\n", - "#23 0.734 Downloading pip-25.3-py3-none-any.whl (1.8 MB)\n", - "#23 0.825 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 28.7 MB/s eta 0:00:00\n", - "#23 0.845 Installing collected packages: pip\n", - "#23 1.590 Successfully installed pip-25.3\n", - "#23 DONE 1.8s\n", - "\n", - "#24 [release 15/20] RUN pip install --no-cache-dir --user -r /tmp/requirements.txt\n", - "#24 0.624 Collecting scikit-image (from -r /tmp/requirements.txt (line 1))\n", - "#24 0.689 Downloading scikit_image-0.26.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (15 kB)\n", - "#24 0.702 Requirement already satisfied: setuptools>=59.5.0 in /usr/lib/python3/dist-packages (from -r /tmp/requirements.txt (line 2)) (68.1.2)\n", - "#24 0.884 Collecting numpy>=1.24 (from scikit-image->-r /tmp/requirements.txt (line 1))\n", - "#24 0.888 Downloading numpy-2.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (6.6 kB)\n", - "#24 0.994 Collecting scipy>=1.11.4 (from scikit-image->-r /tmp/requirements.txt (line 1))\n", - "#24 0.999 Downloading scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (62 kB)\n", - "#24 1.054 Collecting networkx>=3.0 (from scikit-image->-r /tmp/requirements.txt (line 1))\n", - "#24 1.057 Downloading networkx-3.6.1-py3-none-any.whl.metadata (6.8 kB)\n", - "#24 1.200 Collecting pillow>=10.1 (from scikit-image->-r /tmp/requirements.txt (line 1))\n", - "#24 1.203 Downloading pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (8.8 kB)\n", - "#24 1.222 Collecting imageio!=2.35.0,>=2.33 (from scikit-image->-r /tmp/requirements.txt (line 1))\n", - "#24 1.225 Downloading imageio-2.37.2-py3-none-any.whl.metadata (9.7 kB)\n", - "#24 1.264 Collecting tifffile>=2022.8.12 (from scikit-image->-r /tmp/requirements.txt (line 1))\n", - "#24 1.269 Downloading tifffile-2026.1.28-py3-none-any.whl.metadata (30 kB)\n", - "#24 1.285 Collecting packaging>=21 (from scikit-image->-r /tmp/requirements.txt (line 1))\n", - "#24 1.288 Downloading packaging-26.0-py3-none-any.whl.metadata (3.3 kB)\n", - "#24 1.295 Collecting lazy-loader>=0.4 (from scikit-image->-r /tmp/requirements.txt (line 1))\n", - "#24 1.297 Downloading lazy_loader-0.4-py3-none-any.whl.metadata (7.6 kB)\n", - "#24 1.323 Downloading scikit_image-0.26.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (13.6 MB)\n", - "#24 1.508 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.6/13.6 MB 73.9 MB/s 0:00:00\n", - "#24 1.515 Downloading imageio-2.37.2-py3-none-any.whl (317 kB)\n", - "#24 1.521 Downloading lazy_loader-0.4-py3-none-any.whl (12 kB)\n", - "#24 1.526 Downloading networkx-3.6.1-py3-none-any.whl (2.1 MB)\n", - "#24 1.547 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 117.5 MB/s 0:00:00\n", - "#24 1.553 Downloading numpy-2.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (16.4 MB)\n", - "#24 1.695 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.4/16.4 MB 117.6 MB/s 0:00:00\n", - "#24 1.701 Downloading packaging-26.0-py3-none-any.whl (74 kB)\n", - "#24 1.706 Downloading pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (7.0 MB)\n", - "#24 1.771 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.0/7.0 MB 117.4 MB/s 0:00:00\n", - "#24 1.778 Downloading scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (35.0 MB)\n", - "#24 2.148 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 35.0/35.0 MB 94.9 MB/s 0:00:00\n", - "#24 2.155 Downloading tifffile-2026.1.28-py3-none-any.whl (233 kB)\n", - "#24 2.385 Installing collected packages: pillow, packaging, numpy, networkx, tifffile, scipy, lazy-loader, imageio, scikit-image\n", - "#24 10.38 \n", - "#24 10.38 Successfully installed imageio-2.37.2 lazy-loader-0.4 networkx-3.6.1 numpy-2.4.1 packaging-26.0 pillow-12.1.0 scikit-image-0.26.0 scipy-1.17.0 tifffile-2026.1.28\n", - "#24 DONE 11.5s\n", - "\n", - "#25 [release 16/20] RUN pip install monai-deploy-app-sdk==1.0.0\n", - "#25 0.562 Defaulting to user installation because normal site-packages is not writeable\n", - "#25 0.754 Collecting monai-deploy-app-sdk==1.0.0\n", - "#25 0.870 Downloading monai_deploy_app_sdk-1.0.0-py3-none-any.whl.metadata (7.6 kB)\n", - "#25 0.895 Requirement already satisfied: numpy>=1.21.6 in /home/holoscan/.local/lib/python3.12/site-packages (from monai-deploy-app-sdk==1.0.0) (2.4.1)\n", - "#25 1.017 INFO: pip is looking at multiple versions of monai-deploy-app-sdk to determine which version is compatible with other requirements. This could take a while.\n", - "#25 1.017 ERROR: Could not find a version that satisfies the requirement holoscan~=1.0 (from monai-deploy-app-sdk) (from versions: 0.0.0.post1, 2.6.0, 2.7.0, 2.8.0, 2.9.0, 3.0.0, 3.1.0, 3.2.0, 3.3.0, 3.4.0, 3.5.0, 3.6.0, 3.7.0, 3.8.0, 3.9.0, 3.10.0)\n", - "#25 1.144 ERROR: No matching distribution found for holoscan~=1.0\n", - "#25 ERROR: process \"/bin/sh -c pip install monai-deploy-app-sdk==1.0.0\" did not complete successfully: exit code: 1\n", - "------\n", - " > [release 16/20] RUN pip install monai-deploy-app-sdk==1.0.0:\n", - "0.562 Defaulting to user installation because normal site-packages is not writeable\n", - "0.754 Collecting monai-deploy-app-sdk==1.0.0\n", - "0.870 Downloading monai_deploy_app_sdk-1.0.0-py3-none-any.whl.metadata (7.6 kB)\n", - "0.895 Requirement already satisfied: numpy>=1.21.6 in /home/holoscan/.local/lib/python3.12/site-packages (from monai-deploy-app-sdk==1.0.0) (2.4.1)\n", - "1.017 INFO: pip is looking at multiple versions of monai-deploy-app-sdk to determine which version is compatible with other requirements. This could take a while.\n", - "1.017 ERROR: Could not find a version that satisfies the requirement holoscan~=1.0 (from monai-deploy-app-sdk) (from versions: 0.0.0.post1, 2.6.0, 2.7.0, 2.8.0, 2.9.0, 3.0.0, 3.1.0, 3.2.0, 3.3.0, 3.4.0, 3.5.0, 3.6.0, 3.7.0, 3.8.0, 3.9.0, 3.10.0)\n", - "1.144 ERROR: No matching distribution found for holoscan~=1.0\n", - "------\n", - "Dockerfile:139\n", - "--------------------\n", - " 137 | \n", - " 138 | # Install MONAI Deploy from PyPI org\n", - " 139 | >>> RUN pip install monai-deploy-app-sdk==1.0.0\n", - " 140 | \n", - " 141 | \n", - "--------------------\n", - "ERROR: failed to build: failed to solve: process \"/bin/sh -c pip install monai-deploy-app-sdk==1.0.0\" did not complete successfully: exit code: 1\n", - "The command executed was `/usr/bin/docker buildx build --progress plain --build-arg UID=1000 --build-arg GID=1000 --build-arg UNAME=holoscan --build-arg GPU_TYPE=dgpu --builder holoscan_app_builder --pull --load --file /tmp/holoscan_tmpoqhk5myh/Dockerfile --cache-from type=local,src=/home/mqin/.holoscan_build_cache --cache-from type=registry,ref=nvcr.io/nvidia/cuda:12.8.1-runtime-ubuntu24.04 --cache-to type=local,dest=/home/mqin/.holoscan_build_cache --platform linux/amd64 --tag simple_imaging_app-x64-workstation-dgpu-linux-amd64:1.0 /tmp/holoscan_tmpoqhk5myh`.\n", - "It returned with code 1\n", - "The content of stdout is ''\n", - "The content of stderr can be found above the stacktrace (it wasn't captured).\n", - "[2026-01-29 19:22:15,832] [INFO] (packager) - Build Summary:\n", - "\n", - "Platform: x64-workstation/dgpu\n", - " Status: Failure\n", - " Error: Error building image: see Docker output for additional details.\n", - " \n" - ] - } - ], + "outputs": [], "source": [ "tag_prefix = \"simple_imaging_app\"\n", "\n", - "!monai-deploy package simple_imaging_app -c simple_imaging_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 --cuda 12 -l DEBUG" + "# holoscan-cli downloads packaging manifests from GitHub; use the release tag URL\n", + "# because the files are not kept on the main branch.\n", + "import holoscan_cli\n", + "\n", + "cli_version = holoscan_cli.__version__\n", + "manifest_url = (\n", + " f\"https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/\"\n", + " f\"v{cli_version}/releases/{cli_version}/artifacts-cu12.json\"\n", + ")\n", + "\n", + "!monai-deploy package simple_imaging_app -c simple_imaging_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 --cuda 12 -l DEBUG --source {manifest_url}" ] }, { @@ -2158,18 +987,9 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARNING: This output is designed for human readability. For machine-readable output, please use --format.\n", - "simple_imaging_app-x64-workstation-dgpu-linux-amd64:1.0 f6c92cdef0cd 3.58GB 0B U \n" - ] - } - ], + "outputs": [], "source": [ "!docker image ls | grep {tag_prefix}" ] @@ -2188,80 +1008,9 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Display manifests and extract MAP contents to the host folder, ./export\n", - "\n", - "============================== app.json ==============================\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"command\": \"[\\\"python3\\\", \\\"/opt/holoscan/app\\\"]\",\n", - " \"environment\": {\n", - " \"HOLOSCAN_APPLICATION\": \"/opt/holoscan/app\",\n", - " \"HOLOSCAN_INPUT_PATH\": \"input/\",\n", - " \"HOLOSCAN_OUTPUT_PATH\": \"output/\",\n", - " \"HOLOSCAN_WORKDIR\": \"/var/holoscan\",\n", - " \"HOLOSCAN_MODEL_PATH\": \"/opt/holoscan/models\",\n", - " \"HOLOSCAN_CONFIG_PATH\": \"/var/holoscan/app.yaml\",\n", - " \"HOLOSCAN_APP_MANIFEST_PATH\": \"/etc/holoscan/app.json\",\n", - " \"HOLOSCAN_PKG_MANIFEST_PATH\": \"/etc/holoscan/pkg.json\",\n", - " \"HOLOSCAN_DOCS_PATH\": \"/opt/holoscan/docs\",\n", - " \"HOLOSCAN_LOGS_PATH\": \"/var/holoscan/logs\"\n", - " },\n", - " \"input\": {\n", - " \"path\": \"input/\",\n", - " \"formats\": null\n", - " },\n", - " \"liveness\": null,\n", - " \"output\": {\n", - " \"path\": \"output/\",\n", - " \"formats\": null\n", - " },\n", - " \"readiness\": null,\n", - " \"sdk\": \"monai-deploy\",\n", - " \"sdkVersion\": \"1.0.0\",\n", - " \"timeout\": 0,\n", - " \"version\": 1.0,\n", - " \"workingDirectory\": \"/var/holoscan\"\n", - "}\n", - "\n", - "============================== pkg.json ==============================\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"applicationRoot\": \"/opt/holoscan/app\",\n", - " \"modelRoot\": \"/opt/holoscan/models\",\n", - " \"models\": {},\n", - " \"resources\": {\n", - " \"cpu\": 1,\n", - " \"gpu\": 1,\n", - " \"memory\": \"1Gi\",\n", - " \"gpuMemory\": \"1Gi\"\n", - " },\n", - " \"version\": 1.0,\n", - " \"platformConfig\": \"dgpu\"\n", - "}\n", - "\n", - "2026-01-30 03:22:18 [INFO] Copying application from /opt/holoscan/app to /var/run/holoscan/export/app\n", - "\n", - "2026-01-30 03:22:18 [INFO] Copying application manifest file from /etc/holoscan/app.json to /var/run/holoscan/export/config/app.json\n", - "2026-01-30 03:22:18 [INFO] Copying pkg manifest file from /etc/holoscan/pkg.json to /var/run/holoscan/export/config/pkg.json\n", - "2026-01-30 03:22:18 [INFO] Copying application configuration from /var/holoscan/app.yaml to /var/run/holoscan/export/config/app.yaml\n", - "\n", - "2026-01-30 03:22:18 [INFO] Copying models from /opt/holoscan/models to /var/run/holoscan/export/models\n", - "2026-01-30 03:22:18 [INFO] '/opt/holoscan/models' cannot be found.\n", - "\n", - "2026-01-30 03:22:18 [INFO] Copying documentation from /opt/holoscan/docs/ to /var/run/holoscan/export/docs\n", - "2026-01-30 03:22:18 [INFO] '/opt/holoscan/docs/' cannot be found.\n", - "\n", - "app config\n" - ] - } - ], + "outputs": [], "source": [ "\n", "!echo \"Display manifests and extract MAP contents to the host folder, ./export\"\n", @@ -2283,87 +1032,9 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2026-01-29 19:22:19,669] [INFO] (runner) - Checking dependencies...\n", - "[2026-01-29 19:22:19,669] [INFO] (runner) - --> Verifying if \"docker\" is installed...\n", - "\n", - "[2026-01-29 19:22:19,669] [INFO] (runner) - --> Verifying if \"docker-buildx\" is installed...\n", - "\n", - "[2026-01-29 19:22:19,669] [INFO] (runner) - --> Verifying if \"simple_imaging_app-x64-workstation-dgpu-linux-amd64:1.0\" is available...\n", - "\n", - "[2026-01-29 19:22:19,748] [INFO] (runner) - Reading HAP/MAP manifest...\n", - "Successfully copied 2.56kB to /tmp/tmpab8b73v5/app.json\n", - "Successfully copied 2.05kB to /tmp/tmpab8b73v5/pkg.json\n", - "1c29f773e2d9a963e5e1c981c395d822feb9359ccffe1d8e567434e6da6234aa\n", - "[2026-01-29 19:22:20,059] [INFO] (runner) - --> Verifying if \"nvidia-ctk\" is installed...\n", - "\n", - "[2026-01-29 19:22:20,060] [INFO] (runner) - --> Verifying \"nvidia-ctk\" version...\n", - "\n", - "[2026-01-29 19:22:20,502] [INFO] (common) - Launching container (e6cd99531d4a) using image 'simple_imaging_app-x64-workstation-dgpu-linux-amd64:1.0'...\n", - " container name: friendly_perlman\n", - " host name: mingq-dt\n", - " network: host\n", - " user: 1000:1000\n", - " ulimits: memlock=-1:-1, stack=67108864:67108864\n", - " cap_add: CAP_SYS_PTRACE\n", - " ipc mode: host\n", - " shared memory size: 67108864\n", - " devices: \n", - " group_add: 44\n", - "2026-01-30 03:22:21 [INFO] Launching application python3 /opt/holoscan/app ...\n", - "\n", - "[info] [fragment.cpp:1186] Loading extensions from configs...\n", - "\n", - "[info] [gxf_executor.cpp:400] Creating context\n", - "\n", - "[2026-01-30 03:22:22,965] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=['/opt/holoscan/app'])\n", - "\n", - "[2026-01-30 03:22:22,965] [INFO] (root) - AppContext object: AppContext(input_path=/var/holoscan/input, output_path=/var/holoscan/output, model_path=/opt/holoscan/models, workdir=/var/holoscan), triton_server_netloc=\n", - "\n", - "[2026-01-30 03:22:22,965] [INFO] (root) - sample_data_path: /var/holoscan/input\n", - "\n", - "[info] [gxf_executor.cpp:2427] Activating Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2607] Running Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2609] Waiting for completion...\n", - "\n", - "[info] [greedy_scheduler.cpp:191] Scheduling 3 entities\n", - "\n", - "[info] [greedy_scheduler.cpp:405] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "\n", - "[info] [greedy_scheduler.cpp:435] Scheduler finished.\n", - "\n", - "[info] [gxf_executor.cpp:2616] Deactivating Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2625] Graph execution finished.\n", - "\n", - "[info] [gxf_executor.cpp:435] Destroying context\n", - "\n", - "Number of times operator sobel_op whose class is defined in sobel_operator called: 1\n", - "\n", - "Input from: /var/holoscan/input, whose absolute path: /var/holoscan/input\n", - "\n", - "Number of times operator median_op whose class is defined in median_operator called: 1\n", - "\n", - "Number of times operator gaussian_op whose class is defined in gaussian_operator called: 1\n", - "\n", - "Data type of output: , max = np.float64(0.35821119421406195)\n", - "\n", - "Data type of output post conversion: , max = np.uint8(91)\n", - "\n", - "2026-01-30 03:22:24 [INFO] Application exited with 0.\n", - "\n", - "[2026-01-29 19:22:24,525] [INFO] (common) - Container 'friendly_perlman'(e6cd99531d4a) exited with code 0.\n" - ] - } - ], + "outputs": [], "source": [ "# Clear the output folder and run the MAP container. The input is expected to be a folder\n", "!rm -rf {output_path}\n", @@ -2372,38 +1043,9 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_3820941/3197869135.py:3: FutureWarning: `imshow` is deprecated since version 0.25 and will be removed in version 0.27. Please use `matplotlib`, `napari`, etc. to visualize images.\n", - " io.imshow(output_image)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "#output_image_path was set as before, output_image_path = output_path + \"/final_output.png\"\n", "output_image = io.imread(output_image_path)\n", diff --git a/notebooks/tutorials/02_mednist_app-prebuilt.ipynb b/notebooks/tutorials/02_mednist_app-prebuilt.ipynb index 336e0a0e..548977b4 100644 --- a/notebooks/tutorials/02_mednist_app-prebuilt.ipynb +++ b/notebooks/tutorials/02_mednist_app-prebuilt.ipynb @@ -20,23 +20,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Cloning into 'source'...\n", - "remote: Enumerating objects: 314, done.\u001b[K\n", - "remote: Counting objects: 100% (314/314), done.\u001b[K\n", - "remote: Compressing objects: 100% (254/254), done.\u001b[K\n", - "remote: Total 314 (delta 71), reused 184 (delta 36), pack-reused 0 (from 0)\u001b[K\n", - "Receiving objects: 100% (314/314), 1.47 MiB | 3.95 MiB/s, done.\n", - "Resolving deltas: 100% (71/71), done.\n" - ] - } - ], + "outputs": [], "source": [ "!rm -rf source \\\n", " && git clone --branch main --depth 1 https://github.com/Project-MONAI/monai-deploy-app-sdk.git source \\\n", @@ -45,17 +31,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "app.yaml mednist_classifier_monaideploy.py requirements.txt\n" - ] - } - ], + "outputs": [], "source": [ "!ls source/examples/apps/mednist_classifier_monaideploy/" ] @@ -70,71 +48,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: monai-deploy-app-sdk in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (0.5.1+37.g96f7e31.dirty)\n", - "Requirement already satisfied: numpy>=1.21.6 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from monai-deploy-app-sdk) (1.26.4)\n", - "Requirement already satisfied: holoscan~=3.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from monai-deploy-app-sdk) (3.1.0)\n", - "Requirement already satisfied: holoscan-cli~=3.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from monai-deploy-app-sdk) (3.1.0)\n", - "Requirement already satisfied: colorama>=0.4.1 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from monai-deploy-app-sdk) (0.4.6)\n", - "Requirement already satisfied: tritonclient>=2.53.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (2.56.0)\n", - "Requirement already satisfied: typeguard>=3.0.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from monai-deploy-app-sdk) (4.4.2)\n", - "Requirement already satisfied: pip>22.0.2 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from holoscan~=3.0->monai-deploy-app-sdk) (25.0.1)\n", - "Requirement already satisfied: cupy-cuda12x<14.0,>=12.2 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from holoscan~=3.0->monai-deploy-app-sdk) (13.4.1)\n", - "Requirement already satisfied: cloudpickle<4.0,>=3.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from holoscan~=3.0->monai-deploy-app-sdk) (3.1.1)\n", - "Requirement already satisfied: wheel-axle-runtime<1.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from holoscan~=3.0->monai-deploy-app-sdk) (0.0.6)\n", - "Requirement already satisfied: Jinja2<4.0.0,>=3.1.5 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from holoscan-cli~=3.0->monai-deploy-app-sdk) (3.1.6)\n", - "Requirement already satisfied: packaging<24.0,>=23.1 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from holoscan-cli~=3.0->monai-deploy-app-sdk) (23.2)\n", - "Requirement already satisfied: psutil<7.0.0,>=6.0.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from holoscan-cli~=3.0->monai-deploy-app-sdk) (6.1.1)\n", - "Requirement already satisfied: python-on-whales<0.61.0,>=0.60.1 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from holoscan-cli~=3.0->monai-deploy-app-sdk) (0.60.1)\n", - "Requirement already satisfied: pyyaml<7.0,>=6.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from holoscan-cli~=3.0->monai-deploy-app-sdk) (6.0.2)\n", - "Requirement already satisfied: requests<3.0.0,>=2.31.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from holoscan-cli~=3.0->monai-deploy-app-sdk) (2.32.3)\n", - "Requirement already satisfied: python-rapidjson>=0.9.1 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from tritonclient>=2.53.0->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (1.20)\n", - "Requirement already satisfied: urllib3>=2.0.7 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from tritonclient>=2.53.0->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (2.4.0)\n", - "Requirement already satisfied: aiohttp<4.0.0,>=3.8.1 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (3.11.18)\n", - "Requirement already satisfied: cuda-python in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (12.8.0)\n", - "Requirement already satisfied: geventhttpclient>=2.3.3 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (2.3.3)\n", - "Requirement already satisfied: grpcio<1.68,>=1.63.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (1.67.1)\n", - "Requirement already satisfied: protobuf<6.0dev,>=5.26.1 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (5.29.4)\n", - "Requirement already satisfied: typing_extensions>=4.10.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from typeguard>=3.0.0->monai-deploy-app-sdk) (4.13.2)\n", - "Requirement already satisfied: aiohappyeyeballs>=2.3.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (2.6.1)\n", - "Requirement already satisfied: aiosignal>=1.1.2 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (1.3.2)\n", - "Requirement already satisfied: async-timeout<6.0,>=4.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (5.0.1)\n", - "Requirement already satisfied: attrs>=17.3.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (25.3.0)\n", - "Requirement already satisfied: frozenlist>=1.1.1 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (1.6.0)\n", - "Requirement already satisfied: multidict<7.0,>=4.5 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (6.4.3)\n", - "Requirement already satisfied: propcache>=0.2.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (0.3.1)\n", - "Requirement already satisfied: yarl<2.0,>=1.17.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (1.20.0)\n", - "Requirement already satisfied: fastrlock>=0.5 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from cupy-cuda12x<14.0,>=12.2->holoscan~=3.0->monai-deploy-app-sdk) (0.8.3)\n", - "Requirement already satisfied: gevent in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (25.4.1)\n", - "Requirement already satisfied: certifi in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (2025.1.31)\n", - "Requirement already satisfied: brotli in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (1.1.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from Jinja2<4.0.0,>=3.1.5->holoscan-cli~=3.0->monai-deploy-app-sdk) (3.0.2)\n", - "Requirement already satisfied: pydantic<2,>=1.5 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk) (1.10.21)\n", - "Requirement already satisfied: tqdm in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk) (4.67.1)\n", - "Requirement already satisfied: typer>=0.4.1 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk) (0.15.2)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from requests<3.0.0,>=2.31.0->holoscan-cli~=3.0->monai-deploy-app-sdk) (3.4.1)\n", - "Requirement already satisfied: idna<4,>=2.5 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from requests<3.0.0,>=2.31.0->holoscan-cli~=3.0->monai-deploy-app-sdk) (3.10)\n", - "Requirement already satisfied: filelock in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from wheel-axle-runtime<1.0->holoscan~=3.0->monai-deploy-app-sdk) (3.18.0)\n", - "Requirement already satisfied: cuda-bindings~=12.8.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from cuda-python->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (12.8.0)\n", - "Requirement already satisfied: click>=8.0.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from typer>=0.4.1->python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk) (8.1.8)\n", - "Requirement already satisfied: shellingham>=1.3.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from typer>=0.4.1->python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk) (1.5.4)\n", - "Requirement already satisfied: rich>=10.11.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from typer>=0.4.1->python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk) (14.0.0)\n", - "Requirement already satisfied: greenlet>=3.2.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from gevent->geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (3.2.0)\n", - "Requirement already satisfied: zope.event in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from gevent->geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (5.0)\n", - "Requirement already satisfied: zope.interface in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from gevent->geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (7.2)\n", - "Requirement already satisfied: markdown-it-py>=2.2.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from rich>=10.11.0->typer>=0.4.1->python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk) (3.0.0)\n", - "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from rich>=10.11.0->typer>=0.4.1->python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk) (2.19.1)\n", - "Requirement already satisfied: setuptools in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from zope.event->gevent->geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk) (79.0.0)\n", - "Requirement already satisfied: mdurl~=0.1 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer>=0.4.1->python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk) (0.1.2)\n" - ] - } - ], + "outputs": [], "source": [ "!pip install monai-deploy-app-sdk" ] @@ -149,42 +65,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: monai in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (1.4.0)\n", - "Requirement already satisfied: Pillow in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (11.2.1)\n", - "Requirement already satisfied: numpy<2.0,>=1.24 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from monai) (1.26.4)\n", - "Requirement already satisfied: torch>=1.9 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from monai) (2.6.0)\n", - "Requirement already satisfied: filelock in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (3.18.0)\n", - "Requirement already satisfied: typing-extensions>=4.10.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (4.13.2)\n", - "Requirement already satisfied: networkx in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (3.4.2)\n", - "Requirement already satisfied: jinja2 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (3.1.6)\n", - "Requirement already satisfied: fsspec in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (2025.3.2)\n", - "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.4.127 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (12.4.127)\n", - "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.4.127 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (12.4.127)\n", - "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.4.127 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (12.4.127)\n", - "Requirement already satisfied: nvidia-cudnn-cu12==9.1.0.70 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (9.1.0.70)\n", - "Requirement already satisfied: nvidia-cublas-cu12==12.4.5.8 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (12.4.5.8)\n", - "Requirement already satisfied: nvidia-cufft-cu12==11.2.1.3 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (11.2.1.3)\n", - "Requirement already satisfied: nvidia-curand-cu12==10.3.5.147 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (10.3.5.147)\n", - "Requirement already satisfied: nvidia-cusolver-cu12==11.6.1.9 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (11.6.1.9)\n", - "Requirement already satisfied: nvidia-cusparse-cu12==12.3.1.170 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (12.3.1.170)\n", - "Requirement already satisfied: nvidia-cusparselt-cu12==0.6.2 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (0.6.2)\n", - "Requirement already satisfied: nvidia-nccl-cu12==2.21.5 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (2.21.5)\n", - "Requirement already satisfied: nvidia-nvtx-cu12==12.4.127 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (12.4.127)\n", - "Requirement already satisfied: nvidia-nvjitlink-cu12==12.4.127 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (12.4.127)\n", - "Requirement already satisfied: triton==3.2.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (3.2.0)\n", - "Requirement already satisfied: sympy==1.13.1 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from torch>=1.9->monai) (1.13.1)\n", - "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from sympy==1.13.1->torch>=1.9->monai) (1.3.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages (from jinja2->torch>=1.9->monai) (3.0.2)\n" - ] - } - ], + "outputs": [], "source": [ "!pip install monai Pillow # for MONAI transforms and Pillow\n", "!python -c \"import pydicom\" || pip install -q \"pydicom>=1.4.2\"\n", @@ -203,7 +86,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -217,20 +100,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Archive: mednist_classifier_data.zip\n", - " extracting: classifier.zip \n", - " extracting: input/AbdomenCT_007000.jpeg \n", - "classifier.zip\n" - ] - } - ], + "outputs": [], "source": [ "# Unzip the downloaded mednist_classifier_data.zip from the web browser or using gdown, to the notebook/turotials folder, and set up folders\n", "input_folder = \"input\"\n", @@ -257,19 +129,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "env: HOLOSCAN_INPUT_PATH=input\n", - "env: HOLOSCAN_OUTPUT_PATH=output\n", - "env: HOLOSCAN_MODEL_PATH=models\n" - ] - } - ], + "outputs": [], "source": [ "%env HOLOSCAN_INPUT_PATH {input_folder}\n", "%env HOLOSCAN_OUTPUT_PATH {output_folder}\n", @@ -293,37 +155,23 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "usage: monai-deploy package [-h] [-l {DEBUG,INFO,WARN,ERROR,CRITICAL}]\n", - " --config CONFIG [--docs DOCS] [--models MODELS]\n", - " --platform PLATFORM [--add ADDITIONAL_LIBS]\n", - " [--timeout TIMEOUT] [--version VERSION]\n", - " [--base-image BASE_IMAGE]\n", - " [--build-image BUILD_IMAGE]\n", - " [--includes [{debug,holoviz,torch,onnx} ...]]\n", - " [--build-cache BUILD_CACHE]\n", - " [--cmake-args CMAKE_ARGS]\n", - " [--holoscan-sdk-file HOLOSCAN_SDK_FILE]\n", - " [--monai-deploy-sdk-file MONAI_DEPLOY_SDK_FILE]\n", - " [--no-cache] [--sdk SDK] [--source SOURCE]\n", - " [--sdk-version SDK_VERSION] [--output OUTPUT]\n", - " --tag TAG [--username USERNAME] [--uid UID]\n", - " [--gid GID]\n", - " application\n", - "monai-deploy package: error: argument --platform: x64-workstation is not a valid option for --platforms.\n" - ] - } - ], + "outputs": [], "source": [ "tag_prefix = \"mednist_app\"\n", "\n", - "!monai-deploy package \"source/examples/apps/mednist_classifier_monaideploy/mednist_classifier_monaideploy.py\" -m {models_folder} -c \"source/examples/apps/mednist_classifier_monaideploy/app.yaml\" -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG" + "# holoscan-cli downloads packaging manifests from GitHub; use the release tag URL\n", + "# because the files are not kept on the main branch.\n", + "import holoscan_cli\n", + "\n", + "cli_version = holoscan_cli.__version__\n", + "manifest_url = (\n", + " f\"https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/\"\n", + " f\"v{cli_version}/releases/{cli_version}/artifacts-cu12.json\"\n", + ")\n", + "\n", + "!monai-deploy package \"source/examples/apps/mednist_classifier_monaideploy/mednist_classifier_monaideploy.py\" -m {models_folder} -c \"source/examples/apps/mednist_classifier_monaideploy/app.yaml\" -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12 --source {manifest_url}" ] }, { @@ -335,7 +183,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -356,25 +204,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Display manifests and extract MAP contents to the host folder, ./export\n", - "Unable to find image 'mednist_app-x64-workstation-dgpu-linux-amd64:1.0' locally\n", - "docker: Error response from daemon: pull access denied for mednist_app-x64-workstation-dgpu-linux-amd64, repository does not exist or may require 'docker login': denied: requested access to the resource is denied\n", - "\n", - "Run 'docker run --help' for more information\n", - "Unable to find image 'mednist_app-x64-workstation-dgpu-linux-amd64:1.0' locally\n", - "docker: Error response from daemon: pull access denied for mednist_app-x64-workstation-dgpu-linux-amd64, repository does not exist or may require 'docker login': denied: requested access to the resource is denied\n", - "\n", - "Run 'docker run --help' for more information\n" - ] - } - ], + "outputs": [], "source": [ "!echo \"Display manifests and extract MAP contents to the host folder, ./export\"\n", "!docker run --rm {tag_prefix}-x64-workstation-dgpu-linux-amd64:1.0 show\n", @@ -394,31 +226,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2025-04-22 10:01:00,178] [INFO] (runner) - Checking dependencies...\n", - "[2025-04-22 10:01:00,178] [INFO] (runner) - --> Verifying if \"docker\" is installed...\n", - "\n", - "[2025-04-22 10:01:00,179] [INFO] (runner) - --> Verifying if \"docker-buildx\" is installed...\n", - "\n", - "[2025-04-22 10:01:00,179] [INFO] (runner) - --> Verifying if \"mednist_app-x64-workstation-dgpu-linux-amd64:1.0\" is available...\n", - "\n", - "[2025-04-22 10:01:00,206] [INFO] (common) - Attempting to pull image mednist_app-x64-workstation-dgpu-linux-amd64:1.0..\n", - "Error response from daemon: pull access denied for mednist_app-x64-workstation-dgpu-linux-amd64, repository does not exist or may require 'docker login': denied: requested access to the resource is denied\n", - "[2025-04-22 10:01:01,166] [ERROR] (common) - The docker command executed was `/usr/bin/docker image pull mednist_app-x64-workstation-dgpu-linux-amd64:1.0`.\n", - "It returned with code 1\n", - "The content of stdout can be found above the stacktrace (it wasn't captured).\n", - "The content of stderr can be found above the stacktrace (it wasn't captured).\n", - "[2025-04-22 10:01:01,166] [ERROR] (runner) - Unable to fetch required image.\n", - "[2025-04-22 10:01:01,167] [ERROR] (runner) - Execution Aborted\n" - ] - } - ], + "outputs": [], "source": [ "# Clear the output folder and run the MAP. The input is expected to be a folder.\n", "!rm -rf {ouput_folder}\n", @@ -427,17 +237,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "cat: output/output.json: No such file or directory\n" - ] - } - ], + "outputs": [], "source": [ "!cat {output_folder}/output.json" ] @@ -480,7 +282,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -511,7 +313,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -582,7 +384,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -721,7 +523,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -772,52 +574,9 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[info] [fragment.cpp:705] Loading extensions from configs...\n", - "[2025-04-22 10:01:06,211] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=[])\n", - "[2025-04-22 10:01:06,224] [INFO] (root) - AppContext object: AppContext(input_path=input, output_path=output, model_path=models, workdir=), triton_server_netloc=\n", - "[info] [gxf_executor.cpp:265] Creating context\n", - "[info] [gxf_executor.cpp:2396] Activating Graph...\n", - "[info] [gxf_executor.cpp:2426] Running Graph...\n", - "[info] [gxf_executor.cpp:2428] Waiting for completion...\n", - "[info] [greedy_scheduler.cpp:191] Scheduling 3 entities\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/monai/data/meta_tensor.py:116: UserWarning: The given NumPy array is not writable, and PyTorch does not support non-writable tensors. This means writing to this tensor will result in undefined behavior. You may want to copy the array to protect its data or make it writable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at /pytorch/torch/csrc/utils/tensor_numpy.cpp:203.)\n", - " return torch.as_tensor(x, *args, **_kwargs).as_subclass(cls)\n", - "[2025-04-22 10:01:07,561] [WARNING] (pydicom) - 'Dataset.is_implicit_VR' will be removed in v4.0, set the Transfer Syntax UID or use the 'implicit_vr' argument with Dataset.save_as() or dcmwrite() instead\n", - "[2025-04-22 10:01:07,562] [WARNING] (pydicom) - 'Dataset.is_little_endian' will be removed in v4.0, set the Transfer Syntax UID or use the 'little_endian' argument with Dataset.save_as() or dcmwrite() instead\n", - "[2025-04-22 10:01:07,565] [WARNING] (pydicom) - Invalid value for VR UI: 'xyz'. Please see for allowed values for each VR.\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/pydicom/valuerep.py:440: UserWarning: Invalid value for VR UI: 'xyz'. Please see for allowed values for each VR.\n", - " warn_and_log(msg)\n", - "[2025-04-22 10:01:07,575] [WARNING] (pydicom) - 'write_like_original' is deprecated and will be removed in v4.0, please use 'enforce_file_format' instead\n", - "[2025-04-22 10:01:07,581] [INFO] (root) - Finished writing DICOM instance to file output/1.2.826.0.1.3680043.8.498.59762034317112105131069375575619402726.dcm\n", - "[2025-04-22 10:01:07,585] [INFO] (monai.deploy.operators.dicom_text_sr_writer_operator.DICOMTextSRWriterOperator) - DICOM SOP instance saved in output/1.2.826.0.1.3680043.8.498.59762034317112105131069375575619402726.dcm\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "AbdomenCT\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[info] [greedy_scheduler.cpp:372] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "[info] [greedy_scheduler.cpp:401] Scheduler finished.\n", - "[info] [gxf_executor.cpp:2431] Deactivating Graph...\n", - "[info] [gxf_executor.cpp:2439] Graph execution finished.\n", - "[info] [gxf_executor.cpp:295] Destroying context\n" - ] - } - ], + "outputs": [], "source": [ "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", "app = App().run()" @@ -825,17 +584,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\"AbdomenCT\"" - ] - } - ], + "outputs": [], "source": [ "!cat $HOLOSCAN_OUTPUT_PATH/output.json" ] @@ -859,7 +610,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -869,17 +620,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing mednist_app/mednist_classifier_monaideploy.py\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile mednist_app/mednist_classifier_monaideploy.py\n", "\n", @@ -1134,185 +877,18 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[\u001b[32minfo\u001b[m] [fragment.cpp:705] Loading extensions from configs...\n", - "[2025-04-22 10:01:12,273] [INFO] (root) - Parsed args: Namespace(log_level='DEBUG', input=PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/input'), output=PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/output'), model=PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/models'), workdir=None, triton_server_netloc=None, argv=['mednist_app/mednist_classifier_monaideploy.py', '-i', 'input', '-o', 'output', '-m', 'models', '-l', 'DEBUG'])\n", - "[2025-04-22 10:01:12,278] [INFO] (root) - AppContext object: AppContext(input_path=/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/input, output_path=/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/output, model_path=/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/models, workdir=), triton_server_netloc=\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:265] Creating context\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2396] Activating Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2426] Running Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2428] Waiting for completion...\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:191] Scheduling 3 entities\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/monai/data/meta_tensor.py:116: UserWarning: The given NumPy array is not writable, and PyTorch does not support non-writable tensors. This means writing to this tensor will result in undefined behavior. You may want to copy the array to protect its data or make it writable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at /pytorch/torch/csrc/utils/tensor_numpy.cpp:203.)\n", - " return torch.as_tensor(x, *args, **_kwargs).as_subclass(cls)\n", - "AbdomenCT\n", - "[2025-04-22 10:01:13,572] [DEBUG] (monai.deploy.operators.dicom_text_sr_writer_operator.DICOMTextSRWriterOperator) - Writing DICOM object...\n", - "\n", - "[2025-04-22 10:01:13,572] [DEBUG] (root) - Writing DICOM common modules...\n", - "[2025-04-22 10:01:13,573] [WARNING] (pydicom) - 'Dataset.is_implicit_VR' will be removed in v4.0, set the Transfer Syntax UID or use the 'implicit_vr' argument with Dataset.save_as() or dcmwrite() instead\n", - "[2025-04-22 10:01:13,573] [WARNING] (pydicom) - 'Dataset.is_little_endian' will be removed in v4.0, set the Transfer Syntax UID or use the 'little_endian' argument with Dataset.save_as() or dcmwrite() instead\n", - "[2025-04-22 10:01:13,574] [WARNING] (pydicom) - Invalid value for VR UI: 'xyz'. Please see for allowed values for each VR.\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/pydicom/valuerep.py:440: UserWarning: Invalid value for VR UI: 'xyz'. Please see for allowed values for each VR.\n", - " warn_and_log(msg)\n", - "[2025-04-22 10:01:13,576] [DEBUG] (root) - DICOM common modules written:\n", - "Dataset.file_meta -------------------------------\n", - "(0002,0000) File Meta Information Group Length UL: 198\n", - "(0002,0001) File Meta Information Version OB: b'01'\n", - "(0002,0002) Media Storage SOP Class UID UI: Basic Text SR Storage\n", - "(0002,0003) Media Storage SOP Instance UID UI: 1.2.826.0.1.3680043.8.498.41171981535561245877202758927925418229\n", - "(0002,0010) Transfer Syntax UID UI: Implicit VR Little Endian\n", - "(0002,0012) Implementation Class UID UI: 1.2.40.0.13.1.1.1\n", - "(0002,0013) Implementation Version Name SH: '0.5.1+37.g96f7e'\n", - "-------------------------------------------------\n", - "(0008,0005) Specific Character Set CS: 'ISO_IR 100'\n", - "(0008,0012) Instance Creation Date DA: '20250422'\n", - "(0008,0013) Instance Creation Time TM: '100113'\n", - "(0008,0016) SOP Class UID UI: Basic Text SR Storage\n", - "(0008,0018) SOP Instance UID UI: 1.2.826.0.1.3680043.8.498.41171981535561245877202758927925418229\n", - "(0008,0020) Study Date DA: '20250422'\n", - "(0008,0021) Series Date DA: '20250422'\n", - "(0008,0023) Content Date DA: '20250422'\n", - "(0008,002A) Acquisition DateTime DT: '20250422100113'\n", - "(0008,0030) Study Time TM: '100113'\n", - "(0008,0031) Series Time TM: '100113'\n", - "(0008,0033) Content Time TM: '100113'\n", - "(0008,0050) Accession Number SH: ''\n", - "(0008,0060) Modality CS: 'SR'\n", - "(0008,0070) Manufacturer LO: 'MOANI Deploy App SDK'\n", - "(0008,0090) Referring Physician's Name PN: ''\n", - "(0008,0201) Timezone Offset From UTC SH: '-0700'\n", - "(0008,1030) Study Description LO: 'AI results.'\n", - "(0008,103E) Series Description LO: 'CAUTION: Not for Diagnostic Use, for research use only.'\n", - "(0008,1090) Manufacturer's Model Name LO: 'DICOM SR Writer'\n", - "(0010,0010) Patient's Name PN: ''\n", - "(0010,0020) Patient ID LO: ''\n", - "(0010,0021) Issuer of Patient ID LO: ''\n", - "(0010,0030) Patient's Birth Date DA: ''\n", - "(0010,0040) Patient's Sex CS: ''\n", - "(0018,0015) Body Part Examined CS: ''\n", - "(0018,1020) Software Versions LO: '0.5.1+37.g96f7e'\n", - "(0018,A001) Contributing Equipment Sequence 1 item(s) ---- \n", - " (0008,0070) Manufacturer LO: 'MONAI WG Trainer'\n", - " (0008,1090) Manufacturer's Model Name LO: 'MEDNIST Classifier'\n", - " (0018,1002) Device UID UI: xyz\n", - " (0018,1020) Software Versions LO: '0.1'\n", - " (0040,A170) Purpose of Reference Code Sequence 1 item(s) ---- \n", - " (0008,0100) Code Value SH: 'Newcode1'\n", - " (0008,0102) Coding Scheme Designator SH: '99IHE'\n", - " (0008,0104) Code Meaning LO: '\"Processing Algorithm'\n", - " ---------\n", - " ---------\n", - "(0020,000D) Study Instance UID UI: 1.2.826.0.1.3680043.8.498.21427650624285250793329047854027764031\n", - "(0020,000E) Series Instance UID UI: 1.2.826.0.1.3680043.8.498.53141607669515853472048821908030378483\n", - "(0020,0010) Study ID SH: '1'\n", - "(0020,0011) Series Number IS: '1679'\n", - "(0020,0013) Instance Number IS: '1'\n", - "(0040,1001) Requested Procedure ID SH: ''\n", - "[2025-04-22 10:01:13,577] [DEBUG] (root) - DICOM dataset to be written:Dataset.file_meta -------------------------------\n", - "(0002,0000) File Meta Information Group Length UL: 198\n", - "(0002,0001) File Meta Information Version OB: b'01'\n", - "(0002,0002) Media Storage SOP Class UID UI: Basic Text SR Storage\n", - "(0002,0003) Media Storage SOP Instance UID UI: 1.2.826.0.1.3680043.8.498.41171981535561245877202758927925418229\n", - "(0002,0010) Transfer Syntax UID UI: Implicit VR Little Endian\n", - "(0002,0012) Implementation Class UID UI: 1.2.40.0.13.1.1.1\n", - "(0002,0013) Implementation Version Name SH: '0.5.1+37.g96f7e'\n", - "-------------------------------------------------\n", - "(0008,0005) Specific Character Set CS: 'ISO_IR 100'\n", - "(0008,0012) Instance Creation Date DA: '20250422'\n", - "(0008,0013) Instance Creation Time TM: '100113'\n", - "(0008,0016) SOP Class UID UI: Basic Text SR Storage\n", - "(0008,0018) SOP Instance UID UI: 1.2.826.0.1.3680043.8.498.41171981535561245877202758927925418229\n", - "(0008,0020) Study Date DA: '20250422'\n", - "(0008,0021) Series Date DA: '20250422'\n", - "(0008,0023) Content Date DA: '20250422'\n", - "(0008,002A) Acquisition DateTime DT: '20250422100113'\n", - "(0008,0030) Study Time TM: '100113'\n", - "(0008,0031) Series Time TM: '100113'\n", - "(0008,0033) Content Time TM: '100113'\n", - "(0008,0050) Accession Number SH: ''\n", - "(0008,0060) Modality CS: 'SR'\n", - "(0008,0070) Manufacturer LO: 'MOANI Deploy App SDK'\n", - "(0008,0090) Referring Physician's Name PN: ''\n", - "(0008,0201) Timezone Offset From UTC SH: '-0700'\n", - "(0008,1030) Study Description LO: 'AI results.'\n", - "(0008,103E) Series Description LO: 'Not for clinical use. The result is for research use only.'\n", - "(0008,1090) Manufacturer's Model Name LO: 'DICOM SR Writer'\n", - "(0010,0010) Patient's Name PN: ''\n", - "(0010,0020) Patient ID LO: ''\n", - "(0010,0021) Issuer of Patient ID LO: ''\n", - "(0010,0030) Patient's Birth Date DA: ''\n", - "(0010,0040) Patient's Sex CS: ''\n", - "(0018,0015) Body Part Examined CS: ''\n", - "(0018,1020) Software Versions LO: '0.5.1+37.g96f7e'\n", - "(0018,A001) Contributing Equipment Sequence 1 item(s) ---- \n", - " (0008,0070) Manufacturer LO: 'MONAI WG Trainer'\n", - " (0008,1090) Manufacturer's Model Name LO: 'MEDNIST Classifier'\n", - " (0018,1002) Device UID UI: xyz\n", - " (0018,1020) Software Versions LO: '0.1'\n", - " (0040,A170) Purpose of Reference Code Sequence 1 item(s) ---- \n", - " (0008,0100) Code Value SH: 'Newcode1'\n", - " (0008,0102) Coding Scheme Designator SH: '99IHE'\n", - " (0008,0104) Code Meaning LO: '\"Processing Algorithm'\n", - " ---------\n", - " ---------\n", - "(0020,000D) Study Instance UID UI: 1.2.826.0.1.3680043.8.498.21427650624285250793329047854027764031\n", - "(0020,000E) Series Instance UID UI: 1.2.826.0.1.3680043.8.498.53141607669515853472048821908030378483\n", - "(0020,0010) Study ID SH: '1'\n", - "(0020,0011) Series Number IS: '1679'\n", - "(0020,0013) Instance Number IS: '1'\n", - "(0040,1001) Requested Procedure ID SH: ''\n", - "(0040,A040) Value Type CS: 'CONTAINER'\n", - "(0040,A043) Concept Name Code Sequence 1 item(s) ---- \n", - " (0008,0100) Code Value SH: '18748-4'\n", - " (0008,0102) Coding Scheme Designator SH: 'LN'\n", - " (0008,0104) Code Meaning LO: 'Diagnostic Imaging Report'\n", - " ---------\n", - "(0040,A050) Continuity Of Content CS: 'SEPARATE'\n", - "(0040,A493) Verification Flag CS: 'UNVERIFIED'\n", - "(0040,A730) Content Sequence 1 item(s) ---- \n", - " (0040,A010) Relationship Type CS: 'CONTAINS'\n", - " (0040,A040) Value Type CS: 'TEXT'\n", - " (0040,A043) Concept Name Code Sequence 1 item(s) ---- \n", - " (0008,0100) Code Value SH: '111412'\n", - " (0008,0102) Coding Scheme Designator SH: 'DCM'\n", - " (0008,0104) Code Meaning LO: 'Narrative Summary'\n", - " ---------\n", - " (0040,A160) Text Value UT: 'AbdomenCT'\n", - " ---------\n", - "[2025-04-22 10:01:13,577] [WARNING] (pydicom) - 'write_like_original' is deprecated and will be removed in v4.0, please use 'enforce_file_format' instead\n", - "[2025-04-22 10:01:13,580] [INFO] (root) - Finished writing DICOM instance to file /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/output/1.2.826.0.1.3680043.8.498.41171981535561245877202758927925418229.dcm\n", - "[2025-04-22 10:01:13,581] [INFO] (monai.deploy.operators.dicom_text_sr_writer_operator.DICOMTextSRWriterOperator) - DICOM SOP instance saved in /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/output/1.2.826.0.1.3680043.8.498.41171981535561245877202758927925418229.dcm\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:372] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:401] Scheduler finished.\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2431] Deactivating Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2439] Graph execution finished.\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:295] Destroying context\n" - ] - } - ], + "outputs": [], "source": [ "!python \"mednist_app/mednist_classifier_monaideploy.py\" -i {input_folder} -o {output_folder} -m {models_folder} -l DEBUG" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\"AbdomenCT\"" - ] - } - ], + "outputs": [], "source": [ "!cat {output_folder}/output.json" ] @@ -1329,17 +905,9 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing mednist_app/app.yaml\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile mednist_app/app.yaml\n", "%YAML 1.2\n", @@ -1359,17 +927,9 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing mednist_app/requirements.txt\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile mednist_app/requirements.txt\n", "monai>=1.2.0\n", diff --git a/notebooks/tutorials/02_mednist_app.ipynb b/notebooks/tutorials/02_mednist_app.ipynb index 12d4b685..6815a2fb 100644 --- a/notebooks/tutorials/02_mednist_app.ipynb +++ b/notebooks/tutorials/02_mednist_app.ipynb @@ -27,18 +27,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/ignite/handlers/checkpoint.py:17: DeprecationWarning: `TorchScript` support for functional optimizers is deprecated and will be removed in a future PyTorch release. Consider using the `torch.compile` optimizer instead.\n", - " from torch.distributed.optim import ZeroRedundancyOptimizer\n" - ] - } - ], + "outputs": [], "source": [ "# Install necessary packages for MONAI Core\n", "!python -c \"import monai\" || pip install -q \"monai[pillow, tqdm]\"\n", @@ -64,44 +55,7 @@ "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MONAI version: 1.4.0\n", - "Numpy version: 1.26.4\n", - "Pytorch version: 2.5.1+cu124\n", - "MONAI flags: HAS_EXT = False, USE_COMPILED = False, USE_META_DICT = False\n", - "MONAI rev id: 46a5272196a6c2590ca2589029eed8e4d56ff008\n", - "MONAI __file__: /home//src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/monai/__init__.py\n", - "\n", - "Optional dependencies:\n", - "Pytorch Ignite version: 0.4.11\n", - "ITK version: NOT INSTALLED or UNKNOWN VERSION.\n", - "Nibabel version: 5.3.2\n", - "scikit-image version: 0.25.1\n", - "scipy version: 1.15.1\n", - "Pillow version: 11.1.0\n", - "Tensorboard version: NOT INSTALLED or UNKNOWN VERSION.\n", - "gdown version: 5.2.0\n", - "TorchVision version: NOT INSTALLED or UNKNOWN VERSION.\n", - "tqdm version: 4.67.1\n", - "lmdb version: NOT INSTALLED or UNKNOWN VERSION.\n", - "psutil version: 6.1.1\n", - "pandas version: NOT INSTALLED or UNKNOWN VERSION.\n", - "einops version: NOT INSTALLED or UNKNOWN VERSION.\n", - "transformers version: NOT INSTALLED or UNKNOWN VERSION.\n", - "mlflow version: NOT INSTALLED or UNKNOWN VERSION.\n", - "pynrrd version: NOT INSTALLED or UNKNOWN VERSION.\n", - "clearml version: NOT INSTALLED or UNKNOWN VERSION.\n", - "\n", - "For details about installing the optional dependencies, please visit:\n", - " https://monai.readthedocs.io/en/stable/installation.html#installing-the-recommended-dependencies\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Copyright 2020 MONAI Consortium\n", "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", @@ -165,19 +119,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "./MedNIST_DATA\n" - ] - } - ], + "outputs": [], "source": [ "directory = os.environ.get(\"MONAI_DATA_DIRECTORY\")\n", "root_dir = directory if directory else os.path.join(os.path.curdir, \"MedNIST_DATA\")\n", @@ -194,20 +140,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Label names: ['AbdomenCT', 'BreastMRI', 'CXR', 'ChestCT', 'Hand', 'HeadCT']\n", - "Label counts: [10000, 8954, 10000, 10000, 10000, 10000]\n", - "Total image count: 58954\n", - "Image dimensions: 64 x 64\n" - ] - } - ], + "outputs": [], "source": [ "subdirs = sorted(glob.glob(f\"{data_dir}/*/\"))\n", "\n", @@ -237,7 +172,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -256,7 +191,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -280,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -293,21 +228,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/5 Loss: 0.18886765837669373\n", - "Epoch 2/5 Loss: 0.06690701842308044\n", - "Epoch 3/5 Loss: 0.028753578662872314\n", - "Epoch 4/5 Loss: 0.019015837460756302\n", - "Epoch 5/5 Loss: 0.0193385761231184\n" - ] - } - ], + "outputs": [], "source": [ "def _prepare_batch(batch, device, non_blocking):\n", " return tuple(b.to(device) for b in batch)\n", @@ -333,7 +256,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -418,19 +341,7 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "001420.jpeg\n", - "classifier.zip\n", - "env: HOLOSCAN_INPUT_PATH=input\n", - "env: HOLOSCAN_OUTPUT_PATH=output\n", - "env: HOLOSCAN_MODEL_PATH=models\n" - ] - } - ], + "outputs": [], "source": [ "input_folder = \"input\"\n", "output_foler = \"output\"\n", @@ -458,7 +369,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -488,7 +399,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -696,7 +607,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -740,56 +651,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[info] [fragment.cpp:599] Loading extensions from configs...\n", - "[2025-01-29 14:14:52,365] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, argv=[])\n", - "[2025-01-29 14:14:52,380] [INFO] (root) - AppContext object: AppContext(input_path=input, output_path=output, model_path=models, workdir=)\n", - "[info] [gxf_executor.cpp:264] Creating context\n", - "[info] [gxf_executor.cpp:1797] creating input IOSpec named 'output_folder'\n", - "[info] [gxf_executor.cpp:1797] creating input IOSpec named 'image'\n", - "[info] [gxf_executor.cpp:1797] creating input IOSpec named 'study_selected_series_list'\n", - "[info] [gxf_executor.cpp:1797] creating input IOSpec named 'text'\n", - "[info] [gxf_executor.cpp:2208] Activating Graph...\n", - "[info] [gxf_executor.cpp:2238] Running Graph...\n", - "[info] [gxf_executor.cpp:2240] Waiting for completion...\n", - "[info] [greedy_scheduler.cpp:191] Scheduling 3 entities\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/monai/data/meta_tensor.py:116: UserWarning: The given NumPy array is not writable, and PyTorch does not support non-writable tensors. This means writing to this tensor will result in undefined behavior. You may want to copy the array to protect its data or make it writable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at ../torch/csrc/utils/tensor_numpy.cpp:206.)\n", - " return torch.as_tensor(x, *args, **_kwargs).as_subclass(cls)\n", - "[2025-01-29 14:14:53,399] [WARNING] (pydicom) - 'Dataset.is_implicit_VR' will be removed in v4.0, set the Transfer Syntax UID or use the 'implicit_vr' argument with Dataset.save_as() or dcmwrite() instead\n", - "[2025-01-29 14:14:53,400] [WARNING] (pydicom) - 'Dataset.is_little_endian' will be removed in v4.0, set the Transfer Syntax UID or use the 'little_endian' argument with Dataset.save_as() or dcmwrite() instead\n", - "[2025-01-29 14:14:53,402] [WARNING] (pydicom) - Invalid value for VR UI: 'xyz'. Please see for allowed values for each VR.\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/pydicom/valuerep.py:440: UserWarning: Invalid value for VR UI: 'xyz'. Please see for allowed values for each VR.\n", - " warn_and_log(msg)\n", - "[2025-01-29 14:14:53,406] [WARNING] (pydicom) - 'write_like_original' is deprecated and will be removed in v4.0, please use 'enforce_file_format' instead\n", - "[2025-01-29 14:14:53,410] [INFO] (root) - Finished writing DICOM instance to file output/1.2.826.0.1.3680043.8.498.89440030592013337302433440951243230255.dcm\n", - "[2025-01-29 14:14:53,413] [INFO] (monai.deploy.operators.dicom_text_sr_writer_operator.DICOMTextSRWriterOperator) - DICOM SOP instance saved in output/1.2.826.0.1.3680043.8.498.89440030592013337302433440951243230255.dcm\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "AbdomenCT\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[info] [greedy_scheduler.cpp:372] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "[info] [greedy_scheduler.cpp:401] Scheduler finished.\n", - "[info] [gxf_executor.cpp:2243] Deactivating Graph...\n", - "[info] [gxf_executor.cpp:2251] Graph execution finished.\n", - "[info] [gxf_executor.cpp:294] Destroying context\n" - ] - } - ], + "outputs": [], "source": [ "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", "app = App().run()" @@ -797,17 +661,9 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\"AbdomenCT\"" - ] - } - ], + "outputs": [], "source": [ "!cat $HOLOSCAN_OUTPUT_PATH/output.json" ] @@ -828,7 +684,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -841,15 +697,7 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing mednist_app/mednist_classifier_monaideploy.py\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile mednist_app/mednist_classifier_monaideploy.py\n", "\n", @@ -1098,57 +946,18 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[\u001b[32minfo\u001b[m] [fragment.cpp:599] Loading extensions from configs...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:264] Creating context\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:1797] creating input IOSpec named 'output_folder'\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:1797] creating input IOSpec named 'image'\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:1797] creating input IOSpec named 'study_selected_series_list'\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:1797] creating input IOSpec named 'text'\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2208] Activating Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2238] Running Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2240] Waiting for completion...\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:191] Scheduling 3 entities\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/monai/data/meta_tensor.py:116: UserWarning: The given NumPy array is not writable, and PyTorch does not support non-writable tensors. This means writing to this tensor will result in undefined behavior. You may want to copy the array to protect its data or make it writable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at ../torch/csrc/utils/tensor_numpy.cpp:206.)\n", - " return torch.as_tensor(x, *args, **_kwargs).as_subclass(cls)\n", - "AbdomenCT\n", - "WARNING:pydicom:'Dataset.is_implicit_VR' will be removed in v4.0, set the Transfer Syntax UID or use the 'implicit_vr' argument with Dataset.save_as() or dcmwrite() instead\n", - "WARNING:pydicom:'Dataset.is_little_endian' will be removed in v4.0, set the Transfer Syntax UID or use the 'little_endian' argument with Dataset.save_as() or dcmwrite() instead\n", - "WARNING:pydicom:Invalid value for VR UI: 'xyz'. Please see for allowed values for each VR.\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/pydicom/valuerep.py:440: UserWarning: Invalid value for VR UI: 'xyz'. Please see for allowed values for each VR.\n", - " warn_and_log(msg)\n", - "WARNING:pydicom:'write_like_original' is deprecated and will be removed in v4.0, please use 'enforce_file_format' instead\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:372] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:401] Scheduler finished.\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2243] Deactivating Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2251] Graph execution finished.\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:294] Destroying context\n" - ] - } - ], + "outputs": [], "source": [ "!python \"mednist_app/mednist_classifier_monaideploy.py\"" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\"AbdomenCT\"" - ] - } - ], + "outputs": [], "source": [ "!cat $HOLOSCAN_OUTPUT_PATH/output.json" ] @@ -1171,17 +980,9 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing mednist_app/app.yaml\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile mednist_app/app.yaml\n", "%YAML 1.2\n", @@ -1203,15 +1004,7 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing mednist_app/requirements.txt\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile mednist_app/requirements.txt\n", "monai>=1.2.0\n", @@ -1226,725 +1019,21 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2025-01-29 14:15:03,458] [INFO] (common) - Downloading CLI manifest file...\n", - "[2025-01-29 14:15:03,859] [DEBUG] (common) - Validating CLI manifest file...\n", - "[2025-01-29 14:15:03,859] [INFO] (packager.parameters) - Application: /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/mednist_app/mednist_classifier_monaideploy.py\n", - "[2025-01-29 14:15:03,859] [INFO] (packager.parameters) - Detected application type: Python File\n", - "[2025-01-29 14:15:03,860] [INFO] (packager) - Scanning for models in /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/models...\n", - "[2025-01-29 14:15:03,860] [DEBUG] (packager) - Model model=/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/models/model added.\n", - "[2025-01-29 14:15:03,860] [INFO] (packager) - Reading application configuration from /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/mednist_app/app.yaml...\n", - "[2025-01-29 14:15:03,864] [INFO] (packager) - Generating app.json...\n", - "[2025-01-29 14:15:03,864] [INFO] (packager) - Generating pkg.json...\n", - "[2025-01-29 14:15:03,869] [DEBUG] (common) - \n", - "=============== Begin app.json ===============\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"command\": \"[\\\"python3\\\", \\\"/opt/holoscan/app/mednist_classifier_monaideploy.py\\\"]\",\n", - " \"environment\": {\n", - " \"HOLOSCAN_APPLICATION\": \"/opt/holoscan/app\",\n", - " \"HOLOSCAN_INPUT_PATH\": \"input/\",\n", - " \"HOLOSCAN_OUTPUT_PATH\": \"output/\",\n", - " \"HOLOSCAN_WORKDIR\": \"/var/holoscan\",\n", - " \"HOLOSCAN_MODEL_PATH\": \"/opt/holoscan/models\",\n", - " \"HOLOSCAN_CONFIG_PATH\": \"/var/holoscan/app.yaml\",\n", - " \"HOLOSCAN_APP_MANIFEST_PATH\": \"/etc/holoscan/app.json\",\n", - " \"HOLOSCAN_PKG_MANIFEST_PATH\": \"/etc/holoscan/pkg.json\",\n", - " \"HOLOSCAN_DOCS_PATH\": \"/opt/holoscan/docs\",\n", - " \"HOLOSCAN_LOGS_PATH\": \"/var/holoscan/logs\"\n", - " },\n", - " \"input\": {\n", - " \"path\": \"input/\",\n", - " \"formats\": null\n", - " },\n", - " \"liveness\": null,\n", - " \"output\": {\n", - " \"path\": \"output/\",\n", - " \"formats\": null\n", - " },\n", - " \"readiness\": null,\n", - " \"sdk\": \"monai-deploy\",\n", - " \"sdkVersion\": \"2.0.0\",\n", - " \"timeout\": 0,\n", - " \"version\": 1.0,\n", - " \"workingDirectory\": \"/var/holoscan\"\n", - "}\n", - "================ End app.json ================\n", - " \n", - "[2025-01-29 14:15:03,869] [DEBUG] (common) - \n", - "=============== Begin pkg.json ===============\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"applicationRoot\": \"/opt/holoscan/app\",\n", - " \"modelRoot\": \"/opt/holoscan/models\",\n", - " \"models\": {\n", - " \"model\": \"/opt/holoscan/models/model\"\n", - " },\n", - " \"resources\": {\n", - " \"cpu\": 1,\n", - " \"gpu\": 1,\n", - " \"memory\": \"1Gi\",\n", - " \"gpuMemory\": \"1Gi\"\n", - " },\n", - " \"version\": 1.0,\n", - " \"platformConfig\": \"dgpu\"\n", - "}\n", - "================ End pkg.json ================\n", - " \n", - "[2025-01-29 14:15:03,900] [DEBUG] (packager.builder) - \n", - "========== Begin Build Parameters ==========\n", - "{'additional_lib_paths': '',\n", - " 'app_config_file_path': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/mednist_app/app.yaml'),\n", - " 'app_dir': PosixPath('/opt/holoscan/app'),\n", - " 'app_json': '/etc/holoscan/app.json',\n", - " 'application': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/mednist_app/mednist_classifier_monaideploy.py'),\n", - " 'application_directory': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/mednist_app'),\n", - " 'application_type': 'PythonFile',\n", - " 'build_cache': PosixPath('/home/mqin/.holoscan_build_cache'),\n", - " 'cmake_args': '',\n", - " 'command': '[\"python3\", '\n", - " '\"/opt/holoscan/app/mednist_classifier_monaideploy.py\"]',\n", - " 'command_filename': 'mednist_classifier_monaideploy.py',\n", - " 'config_file_path': PosixPath('/var/holoscan/app.yaml'),\n", - " 'docs_dir': PosixPath('/opt/holoscan/docs'),\n", - " 'full_input_path': PosixPath('/var/holoscan/input'),\n", - " 'full_output_path': PosixPath('/var/holoscan/output'),\n", - " 'gid': 1000,\n", - " 'holoscan_sdk_version': '2.9.0',\n", - " 'includes': [],\n", - " 'input_dir': 'input/',\n", - " 'lib_dir': PosixPath('/opt/holoscan/lib'),\n", - " 'logs_dir': PosixPath('/var/holoscan/logs'),\n", - " 'models': {'model': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/models/model')},\n", - " 'models_dir': PosixPath('/opt/holoscan/models'),\n", - " 'monai_deploy_app_sdk_version': '2.0.0',\n", - " 'no_cache': False,\n", - " 'output_dir': 'output/',\n", - " 'pip_packages': None,\n", - " 'pkg_json': '/etc/holoscan/pkg.json',\n", - " 'requirements_file_path': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/mednist_app/requirements.txt'),\n", - " 'sdk': ,\n", - " 'sdk_type': 'monai-deploy',\n", - " 'tarball_output': None,\n", - " 'timeout': 0,\n", - " 'title': 'MONAI Deploy App Package - MedNIST Classifier App',\n", - " 'uid': 1000,\n", - " 'username': 'holoscan',\n", - " 'version': 1.0,\n", - " 'working_dir': PosixPath('/var/holoscan')}\n", - "=========== End Build Parameters ===========\n", - "\n", - "[2025-01-29 14:15:03,900] [DEBUG] (packager.builder) - \n", - "========== Begin Platform Parameters ==========\n", - "{'base_image': 'nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04',\n", - " 'build_image': None,\n", - " 'cuda_deb_arch': 'x86_64',\n", - " 'custom_base_image': False,\n", - " 'custom_holoscan_sdk': False,\n", - " 'custom_monai_deploy_sdk': False,\n", - " 'gpu_type': 'dgpu',\n", - " 'holoscan_deb_arch': 'amd64',\n", - " 'holoscan_sdk_file': '2.9.0',\n", - " 'holoscan_sdk_filename': '2.9.0',\n", - " 'monai_deploy_sdk_file': None,\n", - " 'monai_deploy_sdk_filename': None,\n", - " 'tag': 'mednist_app:1.0',\n", - " 'target_arch': 'x86_64'}\n", - "=========== End Platform Parameters ===========\n", - "\n", - "[2025-01-29 14:15:03,917] [DEBUG] (packager.builder) - \n", - "========== Begin Dockerfile ==========\n", - "\n", - "ARG GPU_TYPE=dgpu\n", - "\n", - "\n", - "\n", - "\n", - "FROM nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04 AS base\n", - "\n", - "RUN apt-get update \\\n", - " && apt-get install -y --no-install-recommends --no-install-suggests \\\n", - " curl \\\n", - " jq \\\n", - " && rm -rf /var/lib/apt/lists/*\n", - "\n", - "\n", - "\n", - "\n", - "# FROM base AS mofed-installer\n", - "# ARG MOFED_VERSION=23.10-2.1.3.1\n", - "\n", - "# # In a container, we only need to install the user space libraries, though the drivers are still\n", - "# # needed on the host.\n", - "# # Note: MOFED's installation is not easily portable, so we can't copy the output of this stage\n", - "# # to our final stage, but must inherit from it. For that reason, we keep track of the build/install\n", - "# # only dependencies in the `MOFED_DEPS` variable (parsing the output of `--check-deps-only`) to\n", - "# # remove them in that same layer, to ensure they are not propagated in the final image.\n", - "# WORKDIR /opt/nvidia/mofed\n", - "# ARG MOFED_INSTALL_FLAGS=\"--dpdk --with-mft --user-space-only --force --without-fw-update\"\n", - "# RUN UBUNTU_VERSION=$(cat /etc/lsb-release | grep DISTRIB_RELEASE | cut -d= -f2) \\\n", - "# && OFED_PACKAGE=\"MLNX_OFED_LINUX-${MOFED_VERSION}-ubuntu${UBUNTU_VERSION}-$(uname -m)\" \\\n", - "# && curl -S -# -o ${OFED_PACKAGE}.tgz -L \\\n", - "# https://www.mellanox.com/downloads/ofed/MLNX_OFED-${MOFED_VERSION}/${OFED_PACKAGE}.tgz \\\n", - "# && tar xf ${OFED_PACKAGE}.tgz \\\n", - "# && MOFED_INSTALLER=$(find . -name mlnxofedinstall -type f -executable -print) \\\n", - "# && MOFED_DEPS=$(${MOFED_INSTALLER} ${MOFED_INSTALL_FLAGS} --check-deps-only 2>/dev/null | tail -n1 | cut -d' ' -f3-) \\\n", - "# && apt-get update \\\n", - "# && apt-get install --no-install-recommends -y ${MOFED_DEPS} \\\n", - "# && ${MOFED_INSTALLER} ${MOFED_INSTALL_FLAGS} \\\n", - "# && rm -r * \\\n", - "# && apt-get remove -y ${MOFED_DEPS} && apt-get autoremove -y \\\n", - "# && rm -rf /var/lib/apt/lists/*\n", - "\n", - "FROM base AS release\n", - "ENV DEBIAN_FRONTEND=noninteractive\n", - "ENV TERM=xterm-256color\n", - "\n", - "ARG GPU_TYPE\n", - "ARG UNAME\n", - "ARG UID\n", - "ARG GID\n", - "\n", - "RUN mkdir -p /etc/holoscan/ \\\n", - " && mkdir -p /opt/holoscan/ \\\n", - " && mkdir -p /var/holoscan \\\n", - " && mkdir -p /opt/holoscan/app \\\n", - " && mkdir -p /var/holoscan/input \\\n", - " && mkdir -p /var/holoscan/output\n", - "\n", - "LABEL base=\"nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\"\n", - "LABEL tag=\"mednist_app:1.0\"\n", - "LABEL org.opencontainers.image.title=\"MONAI Deploy App Package - MedNIST Classifier App\"\n", - "LABEL org.opencontainers.image.version=\"1.0\"\n", - "LABEL org.nvidia.holoscan=\"2.9.0\"\n", - "\n", - "LABEL org.monai.deploy.app-sdk=\"2.0.0\"\n", - "\n", - "ENV HOLOSCAN_INPUT_PATH=/var/holoscan/input\n", - "ENV HOLOSCAN_OUTPUT_PATH=/var/holoscan/output\n", - "ENV HOLOSCAN_WORKDIR=/var/holoscan\n", - "ENV HOLOSCAN_APPLICATION=/opt/holoscan/app\n", - "ENV HOLOSCAN_TIMEOUT=0\n", - "ENV HOLOSCAN_MODEL_PATH=/opt/holoscan/models\n", - "ENV HOLOSCAN_DOCS_PATH=/opt/holoscan/docs\n", - "ENV HOLOSCAN_CONFIG_PATH=/var/holoscan/app.yaml\n", - "ENV HOLOSCAN_APP_MANIFEST_PATH=/etc/holoscan/app.json\n", - "ENV HOLOSCAN_PKG_MANIFEST_PATH=/etc/holoscan/pkg.json\n", - "ENV HOLOSCAN_LOGS_PATH=/var/holoscan/logs\n", - "ENV HOLOSCAN_VERSION=2.9.0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "# If torch is installed, we can skip installing Python\n", - "ENV PYTHON_VERSION=3.10.6-1~22.04\n", - "ENV PYTHON_PIP_VERSION=22.0.2+dfsg-*\n", - "\n", - "RUN apt update \\\n", - " && apt-get install -y --no-install-recommends --no-install-suggests \\\n", - " python3-minimal=${PYTHON_VERSION} \\\n", - " libpython3-stdlib=${PYTHON_VERSION} \\\n", - " python3=${PYTHON_VERSION} \\\n", - " python3-venv=${PYTHON_VERSION} \\\n", - " python3-pip=${PYTHON_PIP_VERSION} \\\n", - " && rm -rf /var/lib/apt/lists/*\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "RUN groupadd -f -g $GID $UNAME\n", - "RUN useradd -rm -d /home/$UNAME -s /bin/bash -g $GID -G sudo -u $UID $UNAME\n", - "RUN chown -R holoscan /var/holoscan && \\\n", - " chown -R holoscan /var/holoscan/input && \\\n", - " chown -R holoscan /var/holoscan/output\n", - "\n", - "# Set the working directory\n", - "WORKDIR /var/holoscan\n", - "\n", - "# Copy HAP/MAP tool script\n", - "COPY ./tools /var/holoscan/tools\n", - "RUN chmod +x /var/holoscan/tools\n", - "\n", - "# Set the working directory\n", - "WORKDIR /var/holoscan\n", - "\n", - "USER $UNAME\n", - "\n", - "ENV PATH=/home/${UNAME}/.local/bin:/opt/nvidia/holoscan/bin:$PATH\n", - "ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/${UNAME}/.local/lib/python3.10/site-packages/holoscan/lib\n", - "\n", - "COPY ./pip/requirements.txt /tmp/requirements.txt\n", - "\n", - "RUN pip install --upgrade pip\n", - "RUN pip install --no-cache-dir --user -r /tmp/requirements.txt\n", - "\n", - "\n", - "# Install MONAI Deploy App SDK\n", - "\n", - "# Install MONAI Deploy from PyPI org\n", - "RUN pip install monai-deploy-app-sdk==2.0.0\n", - "\n", - "\n", - "COPY ./models /opt/holoscan/models\n", - "\n", - "\n", - "COPY ./map/app.json /etc/holoscan/app.json\n", - "COPY ./app.config /var/holoscan/app.yaml\n", - "COPY ./map/pkg.json /etc/holoscan/pkg.json\n", - "\n", - "COPY ./app /opt/holoscan/app\n", - "\n", - "\n", - "ENTRYPOINT [\"/var/holoscan/tools\"]\n", - "=========== End Dockerfile ===========\n", - "\n", - "[2025-01-29 14:15:03,917] [INFO] (packager.builder) - \n", - "===============================================================================\n", - "Building image for: x64-workstation\n", - " Architecture: linux/amd64\n", - " Base Image: nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\n", - " Build Image: N/A\n", - " Cache: Enabled\n", - " Configuration: dgpu\n", - " Holoscan SDK Package: 2.9.0\n", - " MONAI Deploy App SDK Package: N/A\n", - " gRPC Health Probe: N/A\n", - " SDK Version: 2.9.0\n", - " SDK: monai-deploy\n", - " Tag: mednist_app-x64-workstation-dgpu-linux-amd64:1.0\n", - " Included features/dependencies: N/A\n", - " \n", - "[2025-01-29 14:15:04,216] [INFO] (common) - Using existing Docker BuildKit builder `holoscan_app_builder`\n", - "[2025-01-29 14:15:04,216] [DEBUG] (packager.builder) - Building Holoscan Application Package: tag=mednist_app-x64-workstation-dgpu-linux-amd64:1.0\n", - "#0 building with \"holoscan_app_builder\" instance using docker-container driver\n", - "\n", - "#1 [internal] load build definition from Dockerfile\n", - "#1 transferring dockerfile: 4.57kB done\n", - "#1 DONE 0.1s\n", - "\n", - "#2 [internal] load metadata for nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\n", - "#2 ...\n", - "\n", - "#3 [auth] nvidia/cuda:pull token for nvcr.io\n", - "#3 DONE 0.0s\n", - "\n", - "#2 [internal] load metadata for nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\n", - "#2 DONE 0.5s\n", - "\n", - "#4 [internal] load .dockerignore\n", - "#4 transferring context: 1.80kB done\n", - "#4 DONE 0.1s\n", - "\n", - "#5 importing cache manifest from nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\n", - "#5 ...\n", - "\n", - "#6 [internal] load build context\n", - "#6 DONE 0.0s\n", - "\n", - "#7 importing cache manifest from local:12634971125111610588\n", - "#7 inferred cache manifest type: application/vnd.oci.image.index.v1+json done\n", - "#7 DONE 0.0s\n", - "\n", - "#8 [base 1/2] FROM nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04@sha256:22fc009e5cea0b8b91d94c99fdd419d2366810b5ea835e47b8343bc15800c186\n", - "#8 resolve nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04@sha256:22fc009e5cea0b8b91d94c99fdd419d2366810b5ea835e47b8343bc15800c186 0.0s done\n", - "#8 DONE 0.0s\n", - "\n", - "#5 importing cache manifest from nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\n", - "#5 inferred cache manifest type: application/vnd.docker.distribution.manifest.list.v2+json done\n", - "#5 DONE 0.3s\n", - "\n", - "#6 [internal] load build context\n", - "#6 transferring context: 28.62MB 0.2s done\n", - "#6 DONE 0.6s\n", - "\n", - "#9 [release 5/18] RUN chown -R holoscan /var/holoscan && chown -R holoscan /var/holoscan/input && chown -R holoscan /var/holoscan/output\n", - "#9 CACHED\n", - "\n", - "#10 [release 8/18] RUN chmod +x /var/holoscan/tools\n", - "#10 CACHED\n", - "\n", - "#11 [release 4/18] RUN useradd -rm -d /home/holoscan -s /bin/bash -g 1000 -G sudo -u 1000 holoscan\n", - "#11 CACHED\n", - "\n", - "#12 [release 1/18] RUN mkdir -p /etc/holoscan/ && mkdir -p /opt/holoscan/ && mkdir -p /var/holoscan && mkdir -p /opt/holoscan/app && mkdir -p /var/holoscan/input && mkdir -p /var/holoscan/output\n", - "#12 CACHED\n", - "\n", - "#13 [release 7/18] COPY ./tools /var/holoscan/tools\n", - "#13 CACHED\n", - "\n", - "#14 [base 2/2] RUN apt-get update && apt-get install -y --no-install-recommends --no-install-suggests curl jq && rm -rf /var/lib/apt/lists/*\n", - "#14 CACHED\n", - "\n", - "#15 [release 6/18] WORKDIR /var/holoscan\n", - "#15 CACHED\n", - "\n", - "#16 [release 2/18] RUN apt update && apt-get install -y --no-install-recommends --no-install-suggests python3-minimal=3.10.6-1~22.04 libpython3-stdlib=3.10.6-1~22.04 python3=3.10.6-1~22.04 python3-venv=3.10.6-1~22.04 python3-pip=22.0.2+dfsg-* && rm -rf /var/lib/apt/lists/*\n", - "#16 CACHED\n", - "\n", - "#17 [release 3/18] RUN groupadd -f -g 1000 holoscan\n", - "#17 CACHED\n", - "\n", - "#18 [release 9/18] WORKDIR /var/holoscan\n", - "#18 CACHED\n", - "\n", - "#19 [release 10/18] COPY ./pip/requirements.txt /tmp/requirements.txt\n", - "#19 DONE 0.3s\n", - "\n", - "#20 [release 11/18] RUN pip install --upgrade pip\n", - "#20 0.789 Defaulting to user installation because normal site-packages is not writeable\n", - "#20 0.842 Requirement already satisfied: pip in /usr/lib/python3/dist-packages (22.0.2)\n", - "#20 1.003 Collecting pip\n", - "#20 1.069 Downloading pip-25.0-py3-none-any.whl (1.8 MB)\n", - "#20 1.144 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 26.6 MB/s eta 0:00:00\n", - "#20 1.170 Installing collected packages: pip\n", - "#20 1.890 Successfully installed pip-25.0\n", - "#20 DONE 2.1s\n", - "\n", - "#21 [release 12/18] RUN pip install --no-cache-dir --user -r /tmp/requirements.txt\n", - "#21 0.675 Collecting monai>=1.2.0 (from -r /tmp/requirements.txt (line 1))\n", - "#21 0.689 Downloading monai-1.4.0-py3-none-any.whl.metadata (11 kB)\n", - "#21 0.906 Collecting Pillow>=8.4.0 (from -r /tmp/requirements.txt (line 2))\n", - "#21 0.910 Downloading pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl.metadata (9.1 kB)\n", - "#21 0.925 Collecting pydicom>=2.3.0 (from -r /tmp/requirements.txt (line 3))\n", - "#21 0.931 Downloading pydicom-3.0.1-py3-none-any.whl.metadata (9.4 kB)\n", - "#21 1.037 Collecting highdicom>=0.18.2 (from -r /tmp/requirements.txt (line 4))\n", - "#21 1.043 Downloading highdicom-0.24.0-py3-none-any.whl.metadata (4.7 kB)\n", - "#21 1.078 Collecting SimpleITK>=2.0.0 (from -r /tmp/requirements.txt (line 5))\n", - "#21 1.082 Downloading SimpleITK-2.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (7.9 kB)\n", - "#21 1.083 Requirement already satisfied: setuptools>=59.5.0 in /usr/lib/python3/dist-packages (from -r /tmp/requirements.txt (line 6)) (59.6.0)\n", - "#21 1.170 Collecting holoscan>=2.9.0 (from -r /tmp/requirements.txt (line 7))\n", - "#21 1.176 Downloading holoscan-2.9.0-cp310-cp310-manylinux_2_35_x86_64.whl.metadata (7.3 kB)\n", - "#21 1.315 Collecting numpy<2.0,>=1.24 (from monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 1.319 Downloading numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)\n", - "#21 1.357 Collecting torch>=1.9 (from monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 1.361 Downloading torch-2.6.0-cp310-cp310-manylinux1_x86_64.whl.metadata (28 kB)\n", - "#21 1.480 Collecting pyjpegls>=1.0.0 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 4))\n", - "#21 1.486 Downloading pyjpegls-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.5 kB)\n", - "#21 1.500 Collecting typing-extensions>=4.0.0 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 4))\n", - "#21 1.504 Downloading typing_extensions-4.12.2-py3-none-any.whl.metadata (3.0 kB)\n", - "#21 1.507 Requirement already satisfied: pip>22.0.2 in /home/holoscan/.local/lib/python3.10/site-packages (from holoscan>=2.9.0->-r /tmp/requirements.txt (line 7)) (25.0)\n", - "#21 1.518 Collecting cupy-cuda12x<14.0,>=12.2 (from holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 1.523 Downloading cupy_cuda12x-13.3.0-cp310-cp310-manylinux2014_x86_64.whl.metadata (2.7 kB)\n", - "#21 1.554 Collecting cloudpickle<4.0,>=3.0 (from holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 1.559 Downloading cloudpickle-3.1.1-py3-none-any.whl.metadata (7.1 kB)\n", - "#21 1.588 Collecting python-on-whales<1.0,>=0.60.1 (from holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 1.593 Downloading python_on_whales-0.75.1-py3-none-any.whl.metadata (18 kB)\n", - "#21 1.611 Collecting Jinja2<4.0,>=3.1.3 (from holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 1.614 Downloading jinja2-3.1.5-py3-none-any.whl.metadata (2.6 kB)\n", - "#21 1.648 Collecting packaging>=23.1 (from holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 1.652 Downloading packaging-24.2-py3-none-any.whl.metadata (3.2 kB)\n", - "#21 1.679 Collecting pyyaml<7.0,>=6.0 (from holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 1.682 Downloading PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.1 kB)\n", - "#21 1.703 Collecting requests<3.0,>=2.31.0 (from holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 1.706 Downloading requests-2.32.3-py3-none-any.whl.metadata (4.6 kB)\n", - "#21 1.786 Collecting psutil<7.0,>=6.0.0 (from holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 1.790 Downloading psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (22 kB)\n", - "#21 1.873 Collecting wheel-axle-runtime<1.0 (from holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 1.880 Downloading wheel_axle_runtime-0.0.6-py3-none-any.whl.metadata (8.1 kB)\n", - "#21 1.944 Collecting fastrlock>=0.5 (from cupy-cuda12x<14.0,>=12.2->holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 1.948 Downloading fastrlock-0.8.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl.metadata (7.7 kB)\n", - "#21 1.986 Collecting MarkupSafe>=2.0 (from Jinja2<4.0,>=3.1.3->holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 1.990 Downloading MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.0 kB)\n", - "#21 2.005 INFO: pip is looking at multiple versions of pyjpegls to determine which version is compatible with other requirements. This could take a while.\n", - "#21 2.005 Collecting pyjpegls>=1.0.0 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 4))\n", - "#21 2.010 Downloading pyjpegls-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.5 kB)\n", - "#21 2.016 Downloading pyjpegls-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.5 kB)\n", - "#21 2.108 Collecting pydantic!=2.0.*,<3,>=2 (from python-on-whales<1.0,>=0.60.1->holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 2.115 Downloading pydantic-2.10.6-py3-none-any.whl.metadata (30 kB)\n", - "#21 2.175 Collecting charset-normalizer<4,>=2 (from requests<3.0,>=2.31.0->holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 2.179 Downloading charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (35 kB)\n", - "#21 2.190 Collecting idna<4,>=2.5 (from requests<3.0,>=2.31.0->holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 2.195 Downloading idna-3.10-py3-none-any.whl.metadata (10 kB)\n", - "#21 2.228 Collecting urllib3<3,>=1.21.1 (from requests<3.0,>=2.31.0->holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 2.235 Downloading urllib3-2.3.0-py3-none-any.whl.metadata (6.5 kB)\n", - "#21 2.253 Collecting certifi>=2017.4.17 (from requests<3.0,>=2.31.0->holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 2.256 Downloading certifi-2024.12.14-py3-none-any.whl.metadata (2.3 kB)\n", - "#21 2.273 Collecting filelock (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.276 Downloading filelock-3.17.0-py3-none-any.whl.metadata (2.9 kB)\n", - "#21 2.304 Collecting networkx (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.311 Downloading networkx-3.4.2-py3-none-any.whl.metadata (6.3 kB)\n", - "#21 2.333 Collecting fsspec (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.337 Downloading fsspec-2024.12.0-py3-none-any.whl.metadata (11 kB)\n", - "#21 2.381 Collecting nvidia-cuda-nvrtc-cu12==12.4.127 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.385 Downloading nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.395 Collecting nvidia-cuda-runtime-cu12==12.4.127 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.400 Downloading nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.420 Collecting nvidia-cuda-cupti-cu12==12.4.127 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.427 Downloading nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", - "#21 2.442 Collecting nvidia-cudnn-cu12==9.1.0.70 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.447 Downloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", - "#21 2.458 Collecting nvidia-cublas-cu12==12.4.5.8 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.462 Downloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.514 Collecting nvidia-cufft-cu12==11.2.1.3 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.518 Downloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.526 Collecting nvidia-curand-cu12==10.3.5.147 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.530 Downloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.539 Collecting nvidia-cusolver-cu12==11.6.1.9 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.543 Downloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", - "#21 2.558 Collecting nvidia-cusparse-cu12==12.3.1.170 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.563 Downloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", - "#21 2.573 Collecting nvidia-cusparselt-cu12==0.6.2 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.578 Downloading nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl.metadata (6.8 kB)\n", - "#21 2.590 Collecting nvidia-nccl-cu12==2.21.5 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.595 Downloading nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl.metadata (1.8 kB)\n", - "#21 2.607 Collecting nvidia-nvtx-cu12==12.4.127 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.611 Downloading nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.7 kB)\n", - "#21 2.622 Collecting nvidia-nvjitlink-cu12==12.4.127 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.626 Downloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.637 Collecting triton==3.2.0 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.640 Downloading triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.4 kB)\n", - "#21 2.655 Collecting sympy==1.13.1 (from torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.658 Downloading sympy-1.13.1-py3-none-any.whl.metadata (12 kB)\n", - "#21 2.686 Collecting mpmath<1.4,>=1.1.0 (from sympy==1.13.1->torch>=1.9->monai>=1.2.0->-r /tmp/requirements.txt (line 1))\n", - "#21 2.690 Downloading mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB)\n", - "#21 2.715 Collecting annotated-types>=0.6.0 (from pydantic!=2.0.*,<3,>=2->python-on-whales<1.0,>=0.60.1->holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 2.719 Downloading annotated_types-0.7.0-py3-none-any.whl.metadata (15 kB)\n", - "#21 3.298 Collecting pydantic-core==2.27.2 (from pydantic!=2.0.*,<3,>=2->python-on-whales<1.0,>=0.60.1->holoscan>=2.9.0->-r /tmp/requirements.txt (line 7))\n", - "#21 3.301 Downloading pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.6 kB)\n", - "#21 3.324 Downloading monai-1.4.0-py3-none-any.whl (1.5 MB)\n", - "#21 3.353 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.5/1.5 MB 65.9 MB/s eta 0:00:00\n", - "#21 3.360 Downloading pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl (4.5 MB)\n", - "#21 3.405 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.5/4.5 MB 110.9 MB/s eta 0:00:00\n", - "#21 3.412 Downloading pydicom-3.0.1-py3-none-any.whl (2.4 MB)\n", - "#21 3.435 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.4/2.4 MB 116.6 MB/s eta 0:00:00\n", - "#21 3.440 Downloading highdicom-0.24.0-py3-none-any.whl (1.1 MB)\n", - "#21 3.455 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 118.9 MB/s eta 0:00:00\n", - "#21 3.463 Downloading SimpleITK-2.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (52.4 MB)\n", - "#21 3.984 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 52.4/52.4 MB 101.6 MB/s eta 0:00:00\n", - "#21 3.991 Downloading holoscan-2.9.0-cp310-cp310-manylinux_2_35_x86_64.whl (41.1 MB)\n", - "#21 4.401 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 41.1/41.1 MB 101.5 MB/s eta 0:00:00\n", - "#21 4.408 Downloading cloudpickle-3.1.1-py3-none-any.whl (20 kB)\n", - "#21 4.415 Downloading cupy_cuda12x-13.3.0-cp310-cp310-manylinux2014_x86_64.whl (90.6 MB)\n", - "#21 5.321 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 90.6/90.6 MB 100.4 MB/s eta 0:00:00\n", - "#21 5.326 Downloading jinja2-3.1.5-py3-none-any.whl (134 kB)\n", - "#21 5.332 Downloading numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.2 MB)\n", - "#21 5.492 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 18.2/18.2 MB 116.8 MB/s eta 0:00:00\n", - "#21 5.499 Downloading packaging-24.2-py3-none-any.whl (65 kB)\n", - "#21 5.506 Downloading psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (287 kB)\n", - "#21 5.586 Downloading pyjpegls-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.7 MB)\n", - "#21 5.679 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.7/2.7 MB 28.5 MB/s eta 0:00:00\n", - "#21 5.687 Downloading python_on_whales-0.75.1-py3-none-any.whl (114 kB)\n", - "#21 5.693 Downloading PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (751 kB)\n", - "#21 5.703 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 751.2/751.2 kB 111.7 MB/s eta 0:00:00\n", - "#21 5.712 Downloading requests-2.32.3-py3-none-any.whl (64 kB)\n", - "#21 5.721 Downloading torch-2.6.0-cp310-cp310-manylinux1_x86_64.whl (766.7 MB)\n", - "#21 12.46 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 766.7/766.7 MB 113.4 MB/s eta 0:00:00\n", - "#21 12.47 Downloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl (363.4 MB)\n", - "#21 15.69 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 363.4/363.4 MB 116.3 MB/s eta 0:00:00\n", - "#21 15.70 Downloading nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (13.8 MB)\n", - "#21 15.82 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.8/13.8 MB 117.0 MB/s eta 0:00:00\n", - "#21 15.83 Downloading nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (24.6 MB)\n", - "#21 16.05 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 24.6/24.6 MB 116.4 MB/s eta 0:00:00\n", - "#21 16.05 Downloading nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (883 kB)\n", - "#21 16.07 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 883.7/883.7 kB 76.3 MB/s eta 0:00:00\n", - "#21 16.07 Downloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl (664.8 MB)\n", - "#21 21.81 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 664.8/664.8 MB 115.3 MB/s eta 0:00:00\n", - "#21 21.82 Downloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl (211.5 MB)\n", - "#21 23.66 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 211.5/211.5 MB 115.1 MB/s eta 0:00:00\n", - "#21 23.67 Downloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl (56.3 MB)\n", - "#21 24.25 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 56.3/56.3 MB 99.0 MB/s eta 0:00:00\n", - "#21 24.25 Downloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl (127.9 MB)\n", - "#21 25.35 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 127.9/127.9 MB 117.0 MB/s eta 0:00:00\n", - "#21 25.36 Downloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl (207.5 MB)\n", - "#21 27.15 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 207.5/207.5 MB 116.0 MB/s eta 0:00:00\n", - "#21 27.16 Downloading nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl (150.1 MB)\n", - "#21 28.47 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 150.1/150.1 MB 115.5 MB/s eta 0:00:00\n", - "#21 28.48 Downloading nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl (188.7 MB)\n", - "#21 30.18 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 188.7/188.7 MB 111.3 MB/s eta 0:00:00\n", - "#21 30.18 Downloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (21.1 MB)\n", - "#21 30.37 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 21.1/21.1 MB 117.4 MB/s eta 0:00:00\n", - "#21 30.37 Downloading nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (99 kB)\n", - "#21 30.38 Downloading sympy-1.13.1-py3-none-any.whl (6.2 MB)\n", - "#21 30.44 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.2/6.2 MB 117.0 MB/s eta 0:00:00\n", - "#21 30.45 Downloading triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (253.1 MB)\n", - "#21 33.27 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 253.1/253.1 MB 89.9 MB/s eta 0:00:00\n", - "#21 33.27 Downloading typing_extensions-4.12.2-py3-none-any.whl (37 kB)\n", - "#21 33.28 Downloading wheel_axle_runtime-0.0.6-py3-none-any.whl (14 kB)\n", - "#21 33.29 Downloading certifi-2024.12.14-py3-none-any.whl (164 kB)\n", - "#21 33.29 Downloading charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (146 kB)\n", - "#21 33.30 Downloading fastrlock-0.8.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl (53 kB)\n", - "#21 33.31 Downloading idna-3.10-py3-none-any.whl (70 kB)\n", - "#21 33.31 Downloading MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20 kB)\n", - "#21 33.32 Downloading pydantic-2.10.6-py3-none-any.whl (431 kB)\n", - "#21 33.33 Downloading pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB)\n", - "#21 33.41 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.0/2.0 MB 22.9 MB/s eta 0:00:00\n", - "#21 33.42 Downloading urllib3-2.3.0-py3-none-any.whl (128 kB)\n", - "#21 33.42 Downloading filelock-3.17.0-py3-none-any.whl (16 kB)\n", - "#21 33.43 Downloading fsspec-2024.12.0-py3-none-any.whl (183 kB)\n", - "#21 33.44 Downloading networkx-3.4.2-py3-none-any.whl (1.7 MB)\n", - "#21 33.45 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 114.7 MB/s eta 0:00:00\n", - "#21 33.46 Downloading annotated_types-0.7.0-py3-none-any.whl (13 kB)\n", - "#21 33.46 Downloading mpmath-1.3.0-py3-none-any.whl (536 kB)\n", - "#21 33.48 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 536.2/536.2 kB 115.5 MB/s eta 0:00:00\n", - "#21 45.67 Installing collected packages: triton, SimpleITK, nvidia-cusparselt-cu12, mpmath, fastrlock, urllib3, typing-extensions, sympy, pyyaml, pydicom, psutil, Pillow, packaging, nvidia-nvtx-cu12, nvidia-nvjitlink-cu12, nvidia-nccl-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, numpy, networkx, MarkupSafe, idna, fsspec, filelock, cloudpickle, charset-normalizer, certifi, annotated-types, wheel-axle-runtime, requests, pyjpegls, pydantic-core, nvidia-cusparse-cu12, nvidia-cudnn-cu12, Jinja2, cupy-cuda12x, pydantic, nvidia-cusolver-cu12, highdicom, torch, python-on-whales, monai, holoscan\n", - "#21 112.5 Successfully installed Jinja2-3.1.5 MarkupSafe-3.0.2 Pillow-11.1.0 SimpleITK-2.4.1 annotated-types-0.7.0 certifi-2024.12.14 charset-normalizer-3.4.1 cloudpickle-3.1.1 cupy-cuda12x-13.3.0 fastrlock-0.8.3 filelock-3.17.0 fsspec-2024.12.0 highdicom-0.24.0 holoscan-2.9.0 idna-3.10 monai-1.4.0 mpmath-1.3.0 networkx-3.4.2 numpy-1.26.4 nvidia-cublas-cu12-12.4.5.8 nvidia-cuda-cupti-cu12-12.4.127 nvidia-cuda-nvrtc-cu12-12.4.127 nvidia-cuda-runtime-cu12-12.4.127 nvidia-cudnn-cu12-9.1.0.70 nvidia-cufft-cu12-11.2.1.3 nvidia-curand-cu12-10.3.5.147 nvidia-cusolver-cu12-11.6.1.9 nvidia-cusparse-cu12-12.3.1.170 nvidia-cusparselt-cu12-0.6.2 nvidia-nccl-cu12-2.21.5 nvidia-nvjitlink-cu12-12.4.127 nvidia-nvtx-cu12-12.4.127 packaging-24.2 psutil-6.1.1 pydantic-2.10.6 pydantic-core-2.27.2 pydicom-3.0.1 pyjpegls-1.4.0 python-on-whales-0.75.1 pyyaml-6.0.2 requests-2.32.3 sympy-1.13.1 torch-2.6.0 triton-3.2.0 typing-extensions-4.12.2 urllib3-2.3.0 wheel-axle-runtime-0.0.6\n", - "#21 DONE 113.9s\n", - "\n", - "#22 [release 13/18] RUN pip install monai-deploy-app-sdk==2.0.0\n", - "#22 1.416 Defaulting to user installation because normal site-packages is not writeable\n", - "#22 1.603 Collecting monai-deploy-app-sdk==2.0.0\n", - "#22 1.654 Downloading monai_deploy_app_sdk-2.0.0-py3-none-any.whl (132 kB)\n", - "#22 1.697 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 132.6/132.6 KB 3.6 MB/s eta 0:00:00\n", - "#22 1.754 Collecting colorama>=0.4.1\n", - "#22 1.759 Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)\n", - "#22 1.860 Collecting typeguard>=3.0.0\n", - "#22 1.865 Downloading typeguard-4.4.1-py3-none-any.whl (35 kB)\n", - "#22 1.879 Requirement already satisfied: numpy>=1.21.6 in /home/holoscan/.local/lib/python3.10/site-packages (from monai-deploy-app-sdk==2.0.0) (1.26.4)\n", - "#22 1.880 Requirement already satisfied: holoscan~=2.0 in /home/holoscan/.local/lib/python3.10/site-packages (from monai-deploy-app-sdk==2.0.0) (2.9.0)\n", - "#22 1.897 Requirement already satisfied: psutil<7.0,>=6.0.0 in /home/holoscan/.local/lib/python3.10/site-packages (from holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (6.1.1)\n", - "#22 1.898 Requirement already satisfied: pyyaml<7.0,>=6.0 in /home/holoscan/.local/lib/python3.10/site-packages (from holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (6.0.2)\n", - "#22 1.899 Requirement already satisfied: python-on-whales<1.0,>=0.60.1 in /home/holoscan/.local/lib/python3.10/site-packages (from holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (0.75.1)\n", - "#22 1.900 Requirement already satisfied: Jinja2<4.0,>=3.1.3 in /home/holoscan/.local/lib/python3.10/site-packages (from holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (3.1.5)\n", - "#22 1.901 Requirement already satisfied: packaging>=23.1 in /home/holoscan/.local/lib/python3.10/site-packages (from holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (24.2)\n", - "#22 1.902 Requirement already satisfied: cupy-cuda12x<14.0,>=12.2 in /home/holoscan/.local/lib/python3.10/site-packages (from holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (13.3.0)\n", - "#22 1.903 Requirement already satisfied: wheel-axle-runtime<1.0 in /home/holoscan/.local/lib/python3.10/site-packages (from holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (0.0.6)\n", - "#22 1.903 Requirement already satisfied: requests<3.0,>=2.31.0 in /home/holoscan/.local/lib/python3.10/site-packages (from holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (2.32.3)\n", - "#22 1.904 Requirement already satisfied: cloudpickle<4.0,>=3.0 in /home/holoscan/.local/lib/python3.10/site-packages (from holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (3.1.1)\n", - "#22 1.987 Collecting pip>22.0.2\n", - "#22 1.999 Using cached pip-25.0-py3-none-any.whl (1.8 MB)\n", - "#22 2.022 Requirement already satisfied: typing-extensions>=4.10.0 in /home/holoscan/.local/lib/python3.10/site-packages (from typeguard>=3.0.0->monai-deploy-app-sdk==2.0.0) (4.12.2)\n", - "#22 2.036 Requirement already satisfied: fastrlock>=0.5 in /home/holoscan/.local/lib/python3.10/site-packages (from cupy-cuda12x<14.0,>=12.2->holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (0.8.3)\n", - "#22 2.041 Requirement already satisfied: MarkupSafe>=2.0 in /home/holoscan/.local/lib/python3.10/site-packages (from Jinja2<4.0,>=3.1.3->holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (3.0.2)\n", - "#22 2.061 Requirement already satisfied: pydantic!=2.0.*,<3,>=2 in /home/holoscan/.local/lib/python3.10/site-packages (from python-on-whales<1.0,>=0.60.1->holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (2.10.6)\n", - "#22 2.069 Requirement already satisfied: certifi>=2017.4.17 in /home/holoscan/.local/lib/python3.10/site-packages (from requests<3.0,>=2.31.0->holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (2024.12.14)\n", - "#22 2.070 Requirement already satisfied: urllib3<3,>=1.21.1 in /home/holoscan/.local/lib/python3.10/site-packages (from requests<3.0,>=2.31.0->holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (2.3.0)\n", - "#22 2.071 Requirement already satisfied: idna<4,>=2.5 in /home/holoscan/.local/lib/python3.10/site-packages (from requests<3.0,>=2.31.0->holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (3.10)\n", - "#22 2.071 Requirement already satisfied: charset-normalizer<4,>=2 in /home/holoscan/.local/lib/python3.10/site-packages (from requests<3.0,>=2.31.0->holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (3.4.1)\n", - "#22 2.075 Requirement already satisfied: filelock in /home/holoscan/.local/lib/python3.10/site-packages (from wheel-axle-runtime<1.0->holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (3.17.0)\n", - "#22 2.093 Requirement already satisfied: annotated-types>=0.6.0 in /home/holoscan/.local/lib/python3.10/site-packages (from pydantic!=2.0.*,<3,>=2->python-on-whales<1.0,>=0.60.1->holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (0.7.0)\n", - "#22 2.094 Requirement already satisfied: pydantic-core==2.27.2 in /home/holoscan/.local/lib/python3.10/site-packages (from pydantic!=2.0.*,<3,>=2->python-on-whales<1.0,>=0.60.1->holoscan~=2.0->monai-deploy-app-sdk==2.0.0) (2.27.2)\n", - "#22 2.498 Installing collected packages: typeguard, pip, colorama, monai-deploy-app-sdk\n", - "#22 3.427 Successfully installed colorama-0.4.6 monai-deploy-app-sdk-2.0.0 pip-25.0 typeguard-4.4.1\n", - "#22 DONE 3.6s\n", - "\n", - "#23 [release 14/18] COPY ./models /opt/holoscan/models\n", - "#23 DONE 0.3s\n", - "\n", - "#24 [release 15/18] COPY ./map/app.json /etc/holoscan/app.json\n", - "#24 DONE 0.0s\n", - "\n", - "#25 [release 16/18] COPY ./app.config /var/holoscan/app.yaml\n", - "#25 DONE 0.1s\n", - "\n", - "#26 [release 17/18] COPY ./map/pkg.json /etc/holoscan/pkg.json\n", - "#26 DONE 0.2s\n", - "\n", - "#27 [release 18/18] COPY ./app /opt/holoscan/app\n", - "#27 DONE 0.1s\n", - "\n", - "#28 exporting to docker image format\n", - "#28 exporting layers\n", - "#28 exporting layers 205.6s done\n", - "#28 exporting manifest sha256:4da1af22bc19284ede41eafbb2ee59a221a08b1177a65d265463f91f72d9330a 0.0s done\n", - "#28 exporting config sha256:bd0c6ea997b6616e1fe7bcad7af9bdf8cd1349b0e7417d1995a634204e10b7db 0.0s done\n", - "#28 sending tarball\n", - "#28 ...\n", - "\n", - "#29 importing to docker\n", - "#29 loading layer 5a86d5b747ab 276B / 276B\n", - "#29 loading layer fa24015991cf 65.54kB / 5.10MB\n", - "#29 loading layer d0e9054e123a 557.06kB / 3.33GB\n", - "#29 loading layer d0e9054e123a 142.05MB / 3.33GB 6.3s\n", - "#29 loading layer d0e9054e123a 317.52MB / 3.33GB 10.4s\n", - "#29 loading layer d0e9054e123a 521.40MB / 3.33GB 16.5s\n", - "#29 loading layer d0e9054e123a 755.37MB / 3.33GB 20.7s\n", - "#29 loading layer d0e9054e123a 955.91MB / 3.33GB 24.9s\n", - "#29 loading layer d0e9054e123a 1.18GB / 3.33GB 29.0s\n", - "#29 loading layer d0e9054e123a 1.38GB / 3.33GB 33.1s\n", - "#29 loading layer d0e9054e123a 1.60GB / 3.33GB 37.1s\n", - "#29 loading layer d0e9054e123a 1.85GB / 3.33GB 41.3s\n", - "#29 loading layer d0e9054e123a 2.14GB / 3.33GB 45.4s\n", - "#29 loading layer d0e9054e123a 2.30GB / 3.33GB 51.6s\n", - "#29 loading layer d0e9054e123a 2.34GB / 3.33GB 57.5s\n", - "#29 loading layer d0e9054e123a 2.51GB / 3.33GB 63.5s\n", - "#29 loading layer d0e9054e123a 2.71GB / 3.33GB 67.6s\n", - "#29 loading layer d0e9054e123a 2.99GB / 3.33GB 71.8s\n", - "#29 loading layer d0e9054e123a 3.17GB / 3.33GB 78.0s\n", - "#29 loading layer 648e09e4cbfd 65.54kB / 3.82MB\n", - "#29 loading layer 3d06fe16d5f1 262.14kB / 26.20MB\n", - "#29 loading layer 1281a6eddb70 512B / 512B\n", - "#29 loading layer 3a64fd65428a 320B / 320B\n", - "#29 loading layer 958543fd52f7 300B / 300B\n", - "#29 loading layer 2b610be3d181 4.04kB / 4.04kB\n", - "#29 loading layer 5a86d5b747ab 276B / 276B 87.6s done\n", - "#29 loading layer fa24015991cf 65.54kB / 5.10MB 87.6s done\n", - "#29 loading layer d0e9054e123a 3.28GB / 3.33GB 86.9s done\n", - "#29 loading layer 648e09e4cbfd 65.54kB / 3.82MB 1.7s done\n", - "#29 loading layer 3d06fe16d5f1 262.14kB / 26.20MB 1.0s done\n", - "#29 loading layer 1281a6eddb70 512B / 512B 0.5s done\n", - "#29 loading layer 3a64fd65428a 320B / 320B 0.5s done\n", - "#29 loading layer 958543fd52f7 300B / 300B 0.4s done\n", - "#29 loading layer 2b610be3d181 4.04kB / 4.04kB 0.4s done\n", - "#29 DONE 87.6s\n", - "\n", - "#28 exporting to docker image format\n", - "#28 sending tarball 129.0s done\n", - "#28 DONE 334.7s\n", - "\n", - "#30 exporting cache to client directory\n", - "#30 preparing build cache for export\n", - "#30 writing layer sha256:067153055e77a79b3715e3a56caac895ee686a2fa6cadc4423c28d2eb20f0542\n", - "#30 writing layer sha256:067153055e77a79b3715e3a56caac895ee686a2fa6cadc4423c28d2eb20f0542 done\n", - "#30 writing layer sha256:1a0d52c93099897b518eb6cc6cd0fa3d52ff733e8606b4d8c92675ba9e7101ff done\n", - "#30 writing layer sha256:234b866f57e0c5d555af2d87a1857a17ec4ac7e70d2dc6c31ff0a072a4607f24 done\n", - "#30 writing layer sha256:255905badeaa82f032e1043580eed8b745c19cd4a2cb7183883ee5a30f851d6d done\n", - "#30 writing layer sha256:3713021b02770a720dea9b54c03d0ed83e03a2ef5dce2898c56a327fee9a8bca done\n", - "#30 writing layer sha256:3a80776cdc9c9ef79bb38510849c9160f82462d346bf5a8bf29c811391b4e763 done\n", - "#30 writing layer sha256:440849e3569a74baf883d1a14010854807280727ba17c36f82beee5b7d5052b2 done\n", - "#30 writing layer sha256:46c9c54348df10b0d7700bf932d5de7dc5bf9ab91e685db7086e29e381ff8e12 done\n", - "#30 writing layer sha256:4bf64b4a646ee3a3bfe543702f056f9d42e4b3f4cd8465f46a47b0ddc147ecc8\n", - "#30 writing layer sha256:4bf64b4a646ee3a3bfe543702f056f9d42e4b3f4cd8465f46a47b0ddc147ecc8 0.6s done\n", - "#30 writing layer sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1\n", - "#30 writing layer sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 done\n", - "#30 writing layer sha256:67b3546b211deefd67122e680c0932886e0b3c6bd6ae0665e3ab25d2d9f0cda0 done\n", - "#30 writing layer sha256:695ba418a525cecd1c5442c010ea5f070327d38dfa8f533e63ae845fc3660be8 done\n", - "#30 writing layer sha256:7265ec80a3c8c57167f59f1449c2f21828c32e4709977c1b621386bb3184cf5a 0.0s done\n", - "#30 writing layer sha256:7ddbbcbbe9e3f16cc9ad8b9a58d58784b79dc5f14ff7c2b510885ba52c22296d 0.0s done\n", - "#30 writing layer sha256:95f7cac88539ce722ac1b7fd96100ad34e88797194f42e187db5df91772bcbca 0.0s done\n", - "#30 writing layer sha256:980c13e156f90218b216bc6b0430472bbda71c0202804d350c0e16ef02075885 done\n", - "#30 writing layer sha256:99298707ae15b7a513faee23c8ff010664939627cce97994f59b6d5cf59ea118\n", - "#30 writing layer sha256:99298707ae15b7a513faee23c8ff010664939627cce97994f59b6d5cf59ea118 54.5s done\n", - "#30 writing layer sha256:ac52600be001236a2c291a4c5902c915bf5ec9d2441c06d2a54c587b76345847\n", - "#30 writing layer sha256:ac52600be001236a2c291a4c5902c915bf5ec9d2441c06d2a54c587b76345847 done\n", - "#30 writing layer sha256:aee6cca3099a5220871a6e00732843296f61b693822b537c69c1a7bf14cd1b12 0.1s done\n", - "#30 writing layer sha256:bb2407c281c362de0374201b303bd07b66034affb513c87fcc2063aa53df5358 0.1s done\n", - "#30 writing layer sha256:bc25d810fc1fd99656c1b07d422e88cdb896508730175bc3ec187b79f3787044\n", - "#30 preparing build cache for export 55.7s done\n", - "#30 writing layer sha256:bc25d810fc1fd99656c1b07d422e88cdb896508730175bc3ec187b79f3787044 done\n", - "#30 writing layer sha256:be0dad9c160128582482df5e64337c99c213a48988d5d12d453bd03bc2a4c1b1 done\n", - "#30 writing layer sha256:c94af7742e07c9041104260b79637c243ef8dd25eb4241f06ef1a3899a99f2bd done\n", - "#30 writing layer sha256:d339273dfb7fc3b7fd896d3610d360ab9a09ab33a818093cb73b4be7639b6e99 done\n", - "#30 writing layer sha256:e12657e78d4fc5b6d4e07266eec8aee83c8dc1ad0e89648bc4a00b088bab0812 0.0s done\n", - "#30 writing layer sha256:e4010fcd43e6d2b7dc5e01a744445d8d97ecb37c2488c1e5508b1c26d9dc0832 0.0s done\n", - "#30 writing layer sha256:efc9014e2a4cb1e133b80bb4f047e9141e98685eb95b8d2471a8e35b86643e31 done\n", - "#30 writing config sha256:6f53ff17759f64b05fccbdc3ebcc89511178905d0639b8c8c51473fa58aa5930 0.0s done\n", - "#30 writing cache manifest sha256:fc06123c606626b19ea0c2ed6307971938a11e38874ce5f670ed1a909b55f953 0.0s done\n", - "#30 DONE 55.7s\n", - "[2025-01-29 14:23:37,936] [INFO] (packager) - Build Summary:\n", - "\n", - "Platform: x64-workstation/dgpu\n", - " Status: Succeeded\n", - " Docker Tag: mednist_app-x64-workstation-dgpu-linux-amd64:1.0\n", - " Tarball: None\n" - ] - } - ], + "outputs": [], "source": [ "tag_prefix = \"mednist_app\"\n", "\n", - "!monai-deploy package \"mednist_app/mednist_classifier_monaideploy.py\" -m {models_folder} -c \"mednist_app/app.yaml\" -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG" + "# holoscan-cli downloads packaging manifests from GitHub; use the release tag URL\n", + "# because the files are not kept on the main branch.\n", + "import holoscan_cli\n", + "\n", + "cli_version = holoscan_cli.__version__\n", + "manifest_url = (\n", + " f\"https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/\"\n", + " f\"v{cli_version}/releases/{cli_version}/artifacts-cu12.json\"\n", + ")\n", + "\n", + "!monai-deploy package \"mednist_app/mednist_classifier_monaideploy.py\" -m {models_folder} -c \"mednist_app/app.yaml\" -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12 --source {manifest_url}" ] }, { @@ -1961,17 +1050,9 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "mednist_app-x64-workstation-dgpu-linux-amd64 1.0 bd0c6ea997b6 6 minutes ago 8.64GB\n" - ] - } - ], + "outputs": [], "source": [ "!docker image ls | grep {tag_prefix}" ] @@ -1987,93 +1068,9 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2025-01-29 14:23:40,347] [INFO] (runner) - Checking dependencies...\n", - "[2025-01-29 14:23:40,348] [INFO] (runner) - --> Verifying if \"docker\" is installed...\n", - "\n", - "[2025-01-29 14:23:40,349] [INFO] (runner) - --> Verifying if \"docker-buildx\" is installed...\n", - "\n", - "[2025-01-29 14:23:40,353] [INFO] (runner) - --> Verifying if \"mednist_app-x64-workstation-dgpu-linux-amd64:1.0\" is available...\n", - "\n", - "[2025-01-29 14:23:40,453] [INFO] (runner) - Reading HAP/MAP manifest...\n", - "Successfully copied 2.56kB to /tmp/tmpnhktw736/app.json\n", - "Successfully copied 2.05kB to /tmp/tmpnhktw736/pkg.json\n", - "8955ab5e4aef6b83355220e70e421a94b58670eb9ad05cecbba971905c1833b2\n", - "[2025-01-29 14:23:40,759] [INFO] (runner) - --> Verifying if \"nvidia-ctk\" is installed...\n", - "\n", - "[2025-01-29 14:23:40,769] [INFO] (runner) - --> Verifying \"nvidia-ctk\" version...\n", - "\n", - "[2025-01-29 14:23:41,150] [INFO] (common) - Launching container (30bd3cacd8fc) using image 'mednist_app-x64-workstation-dgpu-linux-amd64:1.0'...\n", - " container name: modest_gould\n", - " host name: mingq-dt\n", - " network: host\n", - " user: 1000:1000\n", - " ulimits: memlock=-1:-1, stack=67108864:67108864\n", - " cap_add: CAP_SYS_PTRACE\n", - " ipc mode: host\n", - " shared memory size: 67108864\n", - " devices: \n", - " group_add: 44\n", - "2025-01-29 22:23:42 [INFO] Launching application python3 /opt/holoscan/app/mednist_classifier_monaideploy.py ...\n", - "\n", - "[info] [fragment.cpp:599] Loading extensions from configs...\n", - "\n", - "[info] [gxf_executor.cpp:264] Creating context\n", - "\n", - "[info] [gxf_executor.cpp:1797] creating input IOSpec named 'output_folder'\n", - "\n", - "[info] [gxf_executor.cpp:1797] creating input IOSpec named 'image'\n", - "\n", - "[info] [gxf_executor.cpp:1797] creating input IOSpec named 'study_selected_series_list'\n", - "\n", - "[info] [gxf_executor.cpp:1797] creating input IOSpec named 'text'\n", - "\n", - "[info] [gxf_executor.cpp:2208] Activating Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2238] Running Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2240] Waiting for completion...\n", - "\n", - "[info] [greedy_scheduler.cpp:191] Scheduling 3 entities\n", - "\n", - "/home/holoscan/.local/lib/python3.10/site-packages/monai/data/meta_tensor.py:116: UserWarning: The given NumPy array is not writable, and PyTorch does not support non-writable tensors. This means writing to this tensor will result in undefined behavior. You may want to copy the array to protect its data or make it writable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at /pytorch/torch/csrc/utils/tensor_numpy.cpp:203.)\n", - "\n", - " return torch.as_tensor(x, *args, **_kwargs).as_subclass(cls)\n", - "\n", - "WARNING:pydicom:'Dataset.is_implicit_VR' will be removed in v4.0, set the Transfer Syntax UID or use the 'implicit_vr' argument with Dataset.save_as() or dcmwrite() instead\n", - "\n", - "WARNING:pydicom:'Dataset.is_little_endian' will be removed in v4.0, set the Transfer Syntax UID or use the 'little_endian' argument with Dataset.save_as() or dcmwrite() instead\n", - "\n", - "WARNING:pydicom:Invalid value for VR UI: 'xyz'. Please see for allowed values for each VR.\n", - "\n", - "/home/holoscan/.local/lib/python3.10/site-packages/pydicom/valuerep.py:440: UserWarning: Invalid value for VR UI: 'xyz'. Please see for allowed values for each VR.\n", - "\n", - " warn_and_log(msg)\n", - "\n", - "WARNING:pydicom:'write_like_original' is deprecated and will be removed in v4.0, please use 'enforce_file_format' instead\n", - "\n", - "[info] [greedy_scheduler.cpp:372] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "\n", - "[info] [greedy_scheduler.cpp:401] Scheduler finished.\n", - "\n", - "[info] [gxf_executor.cpp:2243] Deactivating Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2251] Graph execution finished.\n", - "\n", - "[info] [gxf_executor.cpp:294] Destroying context\n", - "\n", - "AbdomenCT\n", - "\n", - "[2025-01-29 14:23:51,575] [INFO] (common) - Container 'modest_gould'(30bd3cacd8fc) exited.\n" - ] - } - ], + "outputs": [], "source": [ "# Clear the output folder and run the MAP. The input is expected to be a folder.\n", "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", @@ -2082,17 +1079,9 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\"AbdomenCT\"" - ] - } - ], + "outputs": [], "source": [ "!cat $HOLOSCAN_OUTPUT_PATH/output.json" ] @@ -2106,7 +1095,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ diff --git a/notebooks/tutorials/03_segmentation_app.ipynb b/notebooks/tutorials/03_segmentation_app.ipynb index 13f7a35a..fa69ef7a 100644 --- a/notebooks/tutorials/03_segmentation_app.ipynb +++ b/notebooks/tutorials/03_segmentation_app.ipynb @@ -92,22 +92,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ":1184: FutureWarning: The cuda.cudart module is deprecated and will be removed in a future release, please switch to use the cuda.bindings.runtime module instead.\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/holoscan/core/__init__.py:111: RuntimeWarning: Current stack size (8.0 MB) is below the recommended minimum (32.0 MB). This may cause segmentation faults or crashes. Consider increasing the stack size with 'ulimit -s 32768', or if using Docker, launch the container with '--ulimit stack=33554432'.\n", - " warnings.warn(\n", - ":1184: FutureWarning: The cuda.cudart module is deprecated and will be removed in a future release, please switch to use the cuda.bindings.runtime module instead.\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/holoscan/core/__init__.py:111: RuntimeWarning: Current stack size (8.0 MB) is below the recommended minimum (32.0 MB). This may cause segmentation faults or crashes. Consider increasing the stack size with 'ulimit -s 32768', or if using Docker, launch the container with '--ulimit stack=33554432'.\n", - " warnings.warn(\n" - ] - } - ], + "outputs": [], "source": [ "# Install MONAI and other necessary image processing packages for the application\n", "!python -c \"import monai\" || pip install --upgrade -q \"monai\"\n", @@ -140,223 +127,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Archive: ai_spleen_seg_bundle_data.zip\n", - " inflating: dcm/1-001.dcm \n", - " inflating: dcm/1-002.dcm \n", - " inflating: dcm/1-003.dcm \n", - " inflating: dcm/1-004.dcm \n", - " inflating: dcm/1-005.dcm \n", - " inflating: dcm/1-006.dcm \n", - " inflating: dcm/1-007.dcm \n", - " inflating: dcm/1-008.dcm \n", - " inflating: dcm/1-009.dcm \n", - " inflating: dcm/1-010.dcm \n", - " inflating: dcm/1-011.dcm \n", - " inflating: dcm/1-012.dcm \n", - " inflating: dcm/1-013.dcm \n", - " inflating: dcm/1-014.dcm \n", - " inflating: dcm/1-015.dcm \n", - " inflating: dcm/1-016.dcm \n", - " inflating: dcm/1-017.dcm \n", - " inflating: dcm/1-018.dcm \n", - " inflating: dcm/1-019.dcm \n", - " inflating: dcm/1-020.dcm \n", - " inflating: dcm/1-021.dcm \n", - " inflating: dcm/1-022.dcm \n", - " inflating: dcm/1-023.dcm \n", - " inflating: dcm/1-024.dcm \n", - " inflating: dcm/1-025.dcm \n", - " inflating: dcm/1-026.dcm \n", - " inflating: dcm/1-027.dcm \n", - " inflating: dcm/1-028.dcm \n", - " inflating: dcm/1-029.dcm \n", - " inflating: dcm/1-030.dcm \n", - " inflating: dcm/1-031.dcm \n", - " inflating: dcm/1-032.dcm \n", - " inflating: dcm/1-033.dcm \n", - " inflating: dcm/1-034.dcm \n", - " inflating: dcm/1-035.dcm \n", - " inflating: dcm/1-036.dcm \n", - " inflating: dcm/1-037.dcm \n", - " inflating: dcm/1-038.dcm \n", - " inflating: dcm/1-039.dcm \n", - " inflating: dcm/1-040.dcm \n", - " inflating: dcm/1-041.dcm \n", - " inflating: dcm/1-042.dcm \n", - " inflating: dcm/1-043.dcm \n", - " inflating: dcm/1-044.dcm \n", - " inflating: dcm/1-045.dcm \n", - " inflating: dcm/1-046.dcm \n", - " inflating: dcm/1-047.dcm \n", - " inflating: dcm/1-048.dcm \n", - " inflating: dcm/1-049.dcm \n", - " inflating: dcm/1-050.dcm \n", - " inflating: dcm/1-051.dcm \n", - " inflating: dcm/1-052.dcm \n", - " inflating: dcm/1-053.dcm \n", - " inflating: dcm/1-054.dcm \n", - " inflating: dcm/1-055.dcm \n", - " inflating: dcm/1-056.dcm \n", - " inflating: dcm/1-057.dcm \n", - " inflating: dcm/1-058.dcm \n", - " inflating: dcm/1-059.dcm \n", - " inflating: dcm/1-060.dcm \n", - " inflating: dcm/1-061.dcm \n", - " inflating: dcm/1-062.dcm \n", - " inflating: dcm/1-063.dcm \n", - " inflating: dcm/1-064.dcm \n", - " inflating: dcm/1-065.dcm \n", - " inflating: dcm/1-066.dcm \n", - " inflating: dcm/1-067.dcm \n", - " inflating: dcm/1-068.dcm \n", - " inflating: dcm/1-069.dcm \n", - " inflating: dcm/1-070.dcm \n", - " inflating: dcm/1-071.dcm \n", - " inflating: dcm/1-072.dcm \n", - " inflating: dcm/1-073.dcm \n", - " inflating: dcm/1-074.dcm \n", - " inflating: dcm/1-075.dcm \n", - " inflating: dcm/1-076.dcm \n", - " inflating: dcm/1-077.dcm \n", - " inflating: dcm/1-078.dcm \n", - " inflating: dcm/1-079.dcm \n", - " inflating: dcm/1-080.dcm \n", - " inflating: dcm/1-081.dcm \n", - " inflating: dcm/1-082.dcm \n", - " inflating: dcm/1-083.dcm \n", - " inflating: dcm/1-084.dcm \n", - " inflating: dcm/1-085.dcm \n", - " inflating: dcm/1-086.dcm \n", - " inflating: dcm/1-087.dcm \n", - " inflating: dcm/1-088.dcm \n", - " inflating: dcm/1-089.dcm \n", - " inflating: dcm/1-090.dcm \n", - " inflating: dcm/1-091.dcm \n", - " inflating: dcm/1-092.dcm \n", - " inflating: dcm/1-093.dcm \n", - " inflating: dcm/1-094.dcm \n", - " inflating: dcm/1-095.dcm \n", - " inflating: dcm/1-096.dcm \n", - " inflating: dcm/1-097.dcm \n", - " inflating: dcm/1-098.dcm \n", - " inflating: dcm/1-099.dcm \n", - " inflating: dcm/1-100.dcm \n", - " inflating: dcm/1-101.dcm \n", - " inflating: dcm/1-102.dcm \n", - " inflating: dcm/1-103.dcm \n", - " inflating: dcm/1-104.dcm \n", - " inflating: dcm/1-105.dcm \n", - " inflating: dcm/1-106.dcm \n", - " inflating: dcm/1-107.dcm \n", - " inflating: dcm/1-108.dcm \n", - " inflating: dcm/1-109.dcm \n", - " inflating: dcm/1-110.dcm \n", - " inflating: dcm/1-111.dcm \n", - " inflating: dcm/1-112.dcm \n", - " inflating: dcm/1-113.dcm \n", - " inflating: dcm/1-114.dcm \n", - " inflating: dcm/1-115.dcm \n", - " inflating: dcm/1-116.dcm \n", - " inflating: dcm/1-117.dcm \n", - " inflating: dcm/1-118.dcm \n", - " inflating: dcm/1-119.dcm \n", - " inflating: dcm/1-120.dcm \n", - " inflating: dcm/1-121.dcm \n", - " inflating: dcm/1-122.dcm \n", - " inflating: dcm/1-123.dcm \n", - " inflating: dcm/1-124.dcm \n", - " inflating: dcm/1-125.dcm \n", - " inflating: dcm/1-126.dcm \n", - " inflating: dcm/1-127.dcm \n", - " inflating: dcm/1-128.dcm \n", - " inflating: dcm/1-129.dcm \n", - " inflating: dcm/1-130.dcm \n", - " inflating: dcm/1-131.dcm \n", - " inflating: dcm/1-132.dcm \n", - " inflating: dcm/1-133.dcm \n", - " inflating: dcm/1-134.dcm \n", - " inflating: dcm/1-135.dcm \n", - " inflating: dcm/1-136.dcm \n", - " inflating: dcm/1-137.dcm \n", - " inflating: dcm/1-138.dcm \n", - " inflating: dcm/1-139.dcm \n", - " inflating: dcm/1-140.dcm \n", - " inflating: dcm/1-141.dcm \n", - " inflating: dcm/1-142.dcm \n", - " inflating: dcm/1-143.dcm \n", - " inflating: dcm/1-144.dcm \n", - " inflating: dcm/1-145.dcm \n", - " inflating: dcm/1-146.dcm \n", - " inflating: dcm/1-147.dcm \n", - " inflating: dcm/1-148.dcm \n", - " inflating: dcm/1-149.dcm \n", - " inflating: dcm/1-150.dcm \n", - " inflating: dcm/1-151.dcm \n", - " inflating: dcm/1-152.dcm \n", - " inflating: dcm/1-153.dcm \n", - " inflating: dcm/1-154.dcm \n", - " inflating: dcm/1-155.dcm \n", - " inflating: dcm/1-156.dcm \n", - " inflating: dcm/1-157.dcm \n", - " inflating: dcm/1-158.dcm \n", - " inflating: dcm/1-159.dcm \n", - " inflating: dcm/1-160.dcm \n", - " inflating: dcm/1-161.dcm \n", - " inflating: dcm/1-162.dcm \n", - " inflating: dcm/1-163.dcm \n", - " inflating: dcm/1-164.dcm \n", - " inflating: dcm/1-165.dcm \n", - " inflating: dcm/1-166.dcm \n", - " inflating: dcm/1-167.dcm \n", - " inflating: dcm/1-168.dcm \n", - " inflating: dcm/1-169.dcm \n", - " inflating: dcm/1-170.dcm \n", - " inflating: dcm/1-171.dcm \n", - " inflating: dcm/1-172.dcm \n", - " inflating: dcm/1-173.dcm \n", - " inflating: dcm/1-174.dcm \n", - " inflating: dcm/1-175.dcm \n", - " inflating: dcm/1-176.dcm \n", - " inflating: dcm/1-177.dcm \n", - " inflating: dcm/1-178.dcm \n", - " inflating: dcm/1-179.dcm \n", - " inflating: dcm/1-180.dcm \n", - " inflating: dcm/1-181.dcm \n", - " inflating: dcm/1-182.dcm \n", - " inflating: dcm/1-183.dcm \n", - " inflating: dcm/1-184.dcm \n", - " inflating: dcm/1-185.dcm \n", - " inflating: dcm/1-186.dcm \n", - " inflating: dcm/1-187.dcm \n", - " inflating: dcm/1-188.dcm \n", - " inflating: dcm/1-189.dcm \n", - " inflating: dcm/1-190.dcm \n", - " inflating: dcm/1-191.dcm \n", - " inflating: dcm/1-192.dcm \n", - " inflating: dcm/1-193.dcm \n", - " inflating: dcm/1-194.dcm \n", - " inflating: dcm/1-195.dcm \n", - " inflating: dcm/1-196.dcm \n", - " inflating: dcm/1-197.dcm \n", - " inflating: dcm/1-198.dcm \n", - " inflating: dcm/1-199.dcm \n", - " inflating: dcm/1-200.dcm \n", - " inflating: dcm/1-201.dcm \n", - " inflating: dcm/1-202.dcm \n", - " inflating: dcm/1-203.dcm \n", - " inflating: dcm/1-204.dcm \n", - " inflating: model.ts \n", - "model.ts\n" - ] - } - ], + "outputs": [], "source": [ "# Download ai_spleen_bundle_data test data zip file. Please request access and download manually.\n", "# !pip install gdown\n", @@ -372,19 +145,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "env: HOLOSCAN_INPUT_PATH=dcm\n", - "env: HOLOSCAN_MODEL_PATH=models\n", - "env: HOLOSCAN_OUTPUT_PATH=output\n" - ] - } - ], + "outputs": [], "source": [ "%env HOLOSCAN_INPUT_PATH dcm\n", "%env HOLOSCAN_MODEL_PATH {models_folder}\n", @@ -402,19 +165,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":1184: FutureWarning: The cuda.cudart module is deprecated and will be removed in a future release, please switch to use the cuda.bindings.runtime module instead.\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/holoscan/core/__init__.py:111: RuntimeWarning: Current stack size (8.0 MB) is below the recommended minimum (32.0 MB). This may cause segmentation faults or crashes. Consider increasing the stack size with 'ulimit -s 32768', or if using Docker, launch the container with '--ulimit stack=33554432'.\n", - " warnings.warn(\n" - ] - } - ], + "outputs": [], "source": [ "import logging\n", "from numpy import uint8 # Needed if SaveImaged is enabled\n", @@ -473,7 +226,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -625,7 +378,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -746,133 +499,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[warning] [application.cpp:548] Current stack size limit (8388608 bytes / 8192 KB) is below the recommended minimum (33554432 bytes / 32768 KB). Consider increasing it with 'ulimit -s 32768'. For Docker, use '--ulimit stack=33554432'\n", - "[info] [fragment.cpp:1122] Loading extensions from configs...\n", - "[2026-03-11 20:29:07,178] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=[])\n", - "[2026-03-11 20:29:07,187] [INFO] (root) - AppContext object: AppContext(input_path=dcm, output_path=output, model_path=models, workdir=), triton_server_netloc=\n", - "[2026-03-11 20:29:07,189] [INFO] (__main__.AISpleenSegApp) - App input and output path: dcm, output\n", - "[2026-03-11 20:29:07,198] [INFO] (monai.deploy.operators.decoder_nvimgcodec) - nvidia.nvimgcodec registered with 8 decoder classes.\n", - "[info] [gxf_executor.cpp:501] Creating context\n", - "[info] [gxf_executor.cpp:2664] Activating Graph...\n", - "[info] [gxf_executor.cpp:2805] Running Graph...\n", - "[info] [gxf_executor.cpp:2807] Waiting for completion...\n", - "[info] [greedy_scheduler.cpp:191] Scheduling 5 entities\n", - "[2026-03-11 20:29:07,286] [INFO] (monai.deploy.operators.dicom_data_loader_operator.DICOMDataLoaderOperator) - No or invalid input path from the optional input port: None\n", - "[2026-03-11 20:29:07,564] [INFO] (root) - Finding series for Selection named: CT Series\n", - "[2026-03-11 20:29:07,566] [INFO] (root) - Searching study, : 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291\n", - " # of series: 1\n", - "[2026-03-11 20:29:07,566] [INFO] (root) - Working on series, instance UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2026-03-11 20:29:07,567] [INFO] (root) - On attribute: 'StudyDescription' to match value: '(.*?)'\n", - "[2026-03-11 20:29:07,568] [INFO] (root) - Series attribute StudyDescription value: CT ABDOMEN W IV CONTRAST\n", - "[2026-03-11 20:29:07,569] [INFO] (root) - On attribute: 'Modality' to match value: '(?i)CT'\n", - "[2026-03-11 20:29:07,569] [INFO] (root) - Series attribute Modality value: CT\n", - "[2026-03-11 20:29:07,570] [INFO] (root) - On attribute: 'SeriesDescription' to match value: '(.*?)'\n", - "[2026-03-11 20:29:07,571] [INFO] (root) - Series attribute SeriesDescription value: ABD/PANC 3.0 B31f\n", - "[2026-03-11 20:29:07,571] [INFO] (root) - On attribute: 'ImageType' to match value: ['PRIMARY', 'ORIGINAL']\n", - "[2026-03-11 20:29:07,572] [INFO] (root) - Series attribute ImageType value: None\n", - "[2026-03-11 20:29:07,573] [INFO] (root) - Instance level attribute ImageType value: [\"['ORIGINAL', 'PRIMARY', 'AXIAL', 'CT_SOM5 SPI']\"]\n", - "[2026-03-11 20:29:07,574] [INFO] (root) - Selected Series, UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2026-03-11 20:29:07,574] [INFO] (root) - Series Selection finalized\n", - "[2026-03-11 20:29:07,575] [INFO] (root) - Series Description of selected DICOM Series for inference: ABD/PANC 3.0 B31f\n", - "[2026-03-11 20:29:07,576] [INFO] (root) - Series Instance UID of selected DICOM Series for inference: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/monai/utils/deprecate_utils.py:321: FutureWarning: monai.transforms.spatial.dictionary Orientationd.__init__:labels: Current default value of argument `labels=(('L', 'R'), ('P', 'A'), ('I', 'S'))` was changed in version None from `labels=(('L', 'R'), ('P', 'A'), ('I', 'S'))` to `labels=None`. Default value changed to None meaning that the transform now uses the 'space' of a meta-tensor, if applicable, to determine appropriate axis labels.\n", - " warn_deprecated(argname, msg, warning_category)\n", - "[2026-03-11 20:29:08,130] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Converted Image object metadata:\n", - "[2026-03-11 20:29:08,131] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesInstanceUID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239, type \n", - "[2026-03-11 20:29:08,132] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesDate: 20090831, type \n", - "[2026-03-11 20:29:08,132] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesTime: 101721.452, type \n", - "[2026-03-11 20:29:08,133] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Modality: CT, type \n", - "[2026-03-11 20:29:08,134] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesDescription: ABD/PANC 3.0 B31f, type \n", - "[2026-03-11 20:29:08,134] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - PatientPosition: HFS, type \n", - "[2026-03-11 20:29:08,135] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesNumber: 8, type \n", - "[2026-03-11 20:29:08,136] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - row_pixel_spacing: 0.7890625, type \n", - "[2026-03-11 20:29:08,136] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - col_pixel_spacing: 0.7890625, type \n", - "[2026-03-11 20:29:08,137] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - depth_pixel_spacing: 1.5, type \n", - "[2026-03-11 20:29:08,138] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - row_direction_cosine: [1.0, 0.0, 0.0], type \n", - "[2026-03-11 20:29:08,138] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - col_direction_cosine: [0.0, 1.0, 0.0], type \n", - "[2026-03-11 20:29:08,139] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - depth_direction_cosine: [0.0, 0.0, 1.0], type \n", - "[2026-03-11 20:29:08,140] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - dicom_affine_transform: [[ 0.7890625 0. 0. -197.60547 ]\n", - " [ 0. 0.7890625 0. -398.60547 ]\n", - " [ 0. 0. 1.5 -383. ]\n", - " [ 0. 0. 0. 1. ]], type \n", - "[2026-03-11 20:29:08,141] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - nifti_affine_transform: [[ -0.7890625 -0. -0. 197.60547 ]\n", - " [ -0. -0.7890625 -0. 398.60547 ]\n", - " [ 0. 0. 1.5 -383. ]\n", - " [ 0. 0. 0. 1. ]], type \n", - "[2026-03-11 20:29:08,142] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyInstanceUID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291, type \n", - "[2026-03-11 20:29:08,143] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyID: , type \n", - "[2026-03-11 20:29:08,144] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyDate: 20090831, type \n", - "[2026-03-11 20:29:08,144] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyTime: 095948.599, type \n", - "[2026-03-11 20:29:08,145] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyDescription: CT ABDOMEN W IV CONTRAST, type \n", - "[2026-03-11 20:29:08,146] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - AccessionNumber: 5471978513296937, type \n", - "[2026-03-11 20:29:08,146] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - selection_name: CT Series, type \n", - "[2026-03-11 20:29:08,147] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - affine: [[ -0.7890625 -0. -0. 197.60547 ]\n", - " [ -0. -0.7890625 -0. 398.60547 ]\n", - " [ 0. 0. 1.5 -383. ]\n", - " [ 0. 0. 0. 1. ]], type \n", - "[2026-03-11 20:29:08,148] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - space: RAS, type \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2026-03-11 20:29:08,778 INFO image_writer.py:197 - writing: /home/mqin/src/md-app-sdk/notebooks/tutorials/output/saved_images_folder/1.3.6.1.4.1.14519.5.2.1.7085.2626/1.3.6.1.4.1.14519.5.2.1.7085.2626.nii\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[2026-03-11 20:29:10,363] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Input of shape: torch.Size([1, 1, 270, 270, 106])\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/monai/inferers/utils.py:226: UserWarning: Using a non-tuple sequence for multidimensional indexing is deprecated and will be changed in pytorch 2.9; use x[tuple(seq)] instead of x[seq]. In pytorch 2.9 this will be interpreted as tensor index, x[torch.tensor(seq)], which will result either in an error or a different result (Triggered internally at /pytorch/torch/csrc/autograd/python_variable_indexing.cpp:347.)\n", - " win_data = torch.cat([inputs[win_slice] for win_slice in unravel_slice]).to(sw_device)\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/monai/inferers/utils.py:370: UserWarning: Using a non-tuple sequence for multidimensional indexing is deprecated and will be changed in pytorch 2.9; use x[tuple(seq)] instead of x[seq]. In pytorch 2.9 this will be interpreted as tensor index, x[torch.tensor(seq)], which will result either in an error or a different result (Triggered internally at /pytorch/torch/csrc/autograd/python_variable_indexing.cpp:347.)\n", - " out[idx_zm] += p\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2026-03-11 20:29:11,872 INFO image_writer.py:197 - writing: /home/mqin/src/md-app-sdk/notebooks/tutorials/output/saved_images_folder/1.3.6.1.4.1.14519.5.2.1.7085.2626/1.3.6.1.4.1.14519.5.2.1.7085.2626_seg.nii\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[2026-03-11 20:29:13,185] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform length/batch size of output: 1\n", - "[2026-03-11 20:29:13,190] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform pixel spacings for pred: tensor([0.7891, 0.7891, 1.5000], dtype=torch.float64)\n", - "[2026-03-11 20:29:13,325] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform pred of shape: (1, 512, 512, 204)\n", - "[2026-03-11 20:29:13,363] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Output Seg image numpy array of type shape: (204, 512, 512)\n", - "[2026-03-11 20:29:13,369] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Output Seg image pixel max value: 1\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/highdicom/base.py:181: UserWarning: The string \"C3N-00198\" is unlikely to represent the intended person name since it contains only a single component. Construct a person name according to the format in described in https://dicom.nema.org/dicom/2013/output/chtml/part05/sect_6.2.html#sect_6.2.1.2, or, in pydicom 2.2.0 or later, use the pydicom.valuerep.PersonName.from_named_components() method to construct the person name correctly. If a single-component name is really intended, add a trailing caret character to disambiguate the name.\n", - " check_person_name(patient_name)\n", - "[2026-03-11 20:29:14,554] [INFO] (highdicom.base) - copy Image-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2026-03-11 20:29:14,555] [INFO] (highdicom.base) - copy attributes of module \"Specimen\"\n", - "[2026-03-11 20:29:14,556] [INFO] (highdicom.base) - copy Patient-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2026-03-11 20:29:14,557] [INFO] (highdicom.base) - copy attributes of module \"Patient\"\n", - "[2026-03-11 20:29:14,558] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Subject\"\n", - "[2026-03-11 20:29:14,558] [INFO] (highdicom.base) - copy Study-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2026-03-11 20:29:14,559] [INFO] (highdicom.base) - copy attributes of module \"General Study\"\n", - "[2026-03-11 20:29:14,560] [INFO] (highdicom.base) - copy attributes of module \"Patient Study\"\n", - "[2026-03-11 20:29:14,561] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Study\"\n", - "[info] [greedy_scheduler.cpp:405] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "[info] [greedy_scheduler.cpp:435] Scheduler finished.\n", - "[info] [gxf_executor.cpp:2814] Deactivating Graph...\n", - "[info] [gxf_executor.cpp:2823] Graph execution finished.\n", - "[2026-03-11 20:29:14,657] [INFO] (__main__.AISpleenSegApp) - End run\n" - ] - } - ], + "outputs": [], "source": [ "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", "app = AISpleenSegApp()\n", @@ -902,7 +531,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -919,17 +548,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing my_app/spleen_seg_operator.py\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile my_app/spleen_seg_operator.py\n", "import logging\n", @@ -1095,17 +716,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing my_app/app.py\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile my_app/app.py\n", "import logging\n", @@ -1252,17 +865,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing my_app/__main__.py\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile my_app/__main__.py\n", "from app import AISpleenSegApp\n", @@ -1273,17 +878,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "app.py\t__main__.py spleen_seg_operator.py\n" - ] - } - ], + "outputs": [], "source": [ "!ls my_app" ] @@ -1301,113 +898,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ":1184: FutureWarning: The cuda.cudart module is deprecated and will be removed in a future release, please switch to use the cuda.bindings.runtime module instead.\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/holoscan/core/__init__.py:111: RuntimeWarning: Current stack size (8.0 MB) is below the recommended minimum (32.0 MB). This may cause segmentation faults or crashes. Consider increasing the stack size with 'ulimit -s 32768', or if using Docker, launch the container with '--ulimit stack=33554432'.\n", - " warnings.warn(\n", - "[\u001b[33m\u001b[1mwarning\u001b[m] [application.cpp:548] Current stack size limit (8388608 bytes / 8192 KB) is below the recommended minimum (33554432 bytes / 32768 KB). Consider increasing it with 'ulimit -s 32768'. For Docker, use '--ulimit stack=33554432'\n", - "[\u001b[32minfo\u001b[m] [fragment.cpp:1122] Loading extensions from configs...\n", - "[2026-03-11 20:29:19,326] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=['my_app'])\n", - "[2026-03-11 20:29:19,327] [INFO] (root) - AppContext object: AppContext(input_path=dcm, output_path=output, model_path=models, workdir=), triton_server_netloc=\n", - "[2026-03-11 20:29:19,328] [INFO] (app.AISpleenSegApp) - App input and output path: dcm, output\n", - "[2026-03-11 20:29:19,330] [INFO] (monai.deploy.operators.decoder_nvimgcodec) - nvidia.nvimgcodec registered with 8 decoder classes.\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:501] Creating context\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2664] Activating Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2805] Running Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2807] Waiting for completion...\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:191] Scheduling 5 entities\n", - "[2026-03-11 20:29:19,352] [INFO] (monai.deploy.operators.dicom_data_loader_operator.DICOMDataLoaderOperator) - No or invalid input path from the optional input port: None\n", - "[2026-03-11 20:29:19,796] [INFO] (root) - Finding series for Selection named: CT Series\n", - "[2026-03-11 20:29:19,796] [INFO] (root) - Searching study, : 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291\n", - " # of series: 1\n", - "[2026-03-11 20:29:19,796] [INFO] (root) - Working on series, instance UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2026-03-11 20:29:19,796] [INFO] (root) - On attribute: 'StudyDescription' to match value: '(.*?)'\n", - "[2026-03-11 20:29:19,796] [INFO] (root) - Series attribute StudyDescription value: CT ABDOMEN W IV CONTRAST\n", - "[2026-03-11 20:29:19,796] [INFO] (root) - On attribute: 'Modality' to match value: '(?i)CT'\n", - "[2026-03-11 20:29:19,796] [INFO] (root) - Series attribute Modality value: CT\n", - "[2026-03-11 20:29:19,796] [INFO] (root) - On attribute: 'SeriesDescription' to match value: '(.*?)'\n", - "[2026-03-11 20:29:19,796] [INFO] (root) - Series attribute SeriesDescription value: ABD/PANC 3.0 B31f\n", - "[2026-03-11 20:29:19,796] [INFO] (root) - On attribute: 'ImageType' to match value: ['PRIMARY', 'ORIGINAL']\n", - "[2026-03-11 20:29:19,796] [INFO] (root) - Series attribute ImageType value: None\n", - "[2026-03-11 20:29:19,797] [INFO] (root) - Instance level attribute ImageType value: [\"['ORIGINAL', 'PRIMARY', 'AXIAL', 'CT_SOM5 SPI']\"]\n", - "[2026-03-11 20:29:19,797] [INFO] (root) - Selected Series, UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2026-03-11 20:29:19,797] [INFO] (root) - Series Selection finalized\n", - "[2026-03-11 20:29:19,797] [INFO] (root) - Series Description of selected DICOM Series for inference: ABD/PANC 3.0 B31f\n", - "[2026-03-11 20:29:19,797] [INFO] (root) - Series Instance UID of selected DICOM Series for inference: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/monai/utils/deprecate_utils.py:321: FutureWarning: monai.transforms.spatial.dictionary Orientationd.__init__:labels: Current default value of argument `labels=(('L', 'R'), ('P', 'A'), ('I', 'S'))` was changed in version None from `labels=(('L', 'R'), ('P', 'A'), ('I', 'S'))` to `labels=None`. Default value changed to None meaning that the transform now uses the 'space' of a meta-tensor, if applicable, to determine appropriate axis labels.\n", - " warn_deprecated(argname, msg, warning_category)\n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Converted Image object metadata:\n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesInstanceUID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239, type \n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesDate: 20090831, type \n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesTime: 101721.452, type \n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Modality: CT, type \n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesDescription: ABD/PANC 3.0 B31f, type \n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - PatientPosition: HFS, type \n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesNumber: 8, type \n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - row_pixel_spacing: 0.7890625, type \n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - col_pixel_spacing: 0.7890625, type \n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - depth_pixel_spacing: 1.5, type \n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - row_direction_cosine: [1.0, 0.0, 0.0], type \n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - col_direction_cosine: [0.0, 1.0, 0.0], type \n", - "[2026-03-11 20:29:20,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - depth_direction_cosine: [0.0, 0.0, 1.0], type \n", - "[2026-03-11 20:29:20,158] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - dicom_affine_transform: [[ 0.7890625 0. 0. -197.60547 ]\n", - " [ 0. 0.7890625 0. -398.60547 ]\n", - " [ 0. 0. 1.5 -383. ]\n", - " [ 0. 0. 0. 1. ]], type \n", - "[2026-03-11 20:29:20,158] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - nifti_affine_transform: [[ -0.7890625 -0. -0. 197.60547 ]\n", - " [ -0. -0.7890625 -0. 398.60547 ]\n", - " [ 0. 0. 1.5 -383. ]\n", - " [ 0. 0. 0. 1. ]], type \n", - "[2026-03-11 20:29:20,158] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyInstanceUID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291, type \n", - "[2026-03-11 20:29:20,158] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyID: , type \n", - "[2026-03-11 20:29:20,158] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyDate: 20090831, type \n", - "[2026-03-11 20:29:20,158] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyTime: 095948.599, type \n", - "[2026-03-11 20:29:20,158] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyDescription: CT ABDOMEN W IV CONTRAST, type \n", - "[2026-03-11 20:29:20,158] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - AccessionNumber: 5471978513296937, type \n", - "[2026-03-11 20:29:20,158] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - selection_name: CT Series, type \n", - "[2026-03-11 20:29:20,158] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - affine: [[ -0.7890625 -0. -0. 197.60547 ]\n", - " [ -0. -0.7890625 -0. 398.60547 ]\n", - " [ 0. 0. 1.5 -383. ]\n", - " [ 0. 0. 0. 1. ]], type \n", - "[2026-03-11 20:29:20,158] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - space: RAS, type \n", - "2026-03-11 20:29:20,770 INFO image_writer.py:197 - writing: /home/mqin/src/md-app-sdk/notebooks/tutorials/output/saved_images_folder/1.3.6.1.4.1.14519.5.2.1.7085.2626/1.3.6.1.4.1.14519.5.2.1.7085.2626.nii\n", - "[2026-03-11 20:29:22,417] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Input of shape: torch.Size([1, 1, 270, 270, 106])\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/monai/inferers/utils.py:226: UserWarning: Using a non-tuple sequence for multidimensional indexing is deprecated and will be changed in pytorch 2.9; use x[tuple(seq)] instead of x[seq]. In pytorch 2.9 this will be interpreted as tensor index, x[torch.tensor(seq)], which will result either in an error or a different result (Triggered internally at /pytorch/torch/csrc/autograd/python_variable_indexing.cpp:347.)\n", - " win_data = torch.cat([inputs[win_slice] for win_slice in unravel_slice]).to(sw_device)\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/monai/inferers/utils.py:370: UserWarning: Using a non-tuple sequence for multidimensional indexing is deprecated and will be changed in pytorch 2.9; use x[tuple(seq)] instead of x[seq]. In pytorch 2.9 this will be interpreted as tensor index, x[torch.tensor(seq)], which will result either in an error or a different result (Triggered internally at /pytorch/torch/csrc/autograd/python_variable_indexing.cpp:347.)\n", - " out[idx_zm] += p\n", - "2026-03-11 20:29:23,485 INFO image_writer.py:197 - writing: /home/mqin/src/md-app-sdk/notebooks/tutorials/output/saved_images_folder/1.3.6.1.4.1.14519.5.2.1.7085.2626/1.3.6.1.4.1.14519.5.2.1.7085.2626_seg.nii\n", - "[2026-03-11 20:29:24,898] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform length/batch size of output: 1\n", - "[2026-03-11 20:29:24,899] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform pixel spacings for pred: tensor([0.7891, 0.7891, 1.5000], dtype=torch.float64)\n", - "[2026-03-11 20:29:25,023] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform pred of shape: (1, 512, 512, 204)\n", - "[2026-03-11 20:29:25,060] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Output Seg image numpy array of type shape: (204, 512, 512)\n", - "[2026-03-11 20:29:25,065] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Output Seg image pixel max value: 1\n", - "/home/mqin/src/md-app-sdk/.venv/lib/python3.10/site-packages/highdicom/base.py:181: UserWarning: The string \"C3N-00198\" is unlikely to represent the intended person name since it contains only a single component. Construct a person name according to the format in described in https://dicom.nema.org/dicom/2013/output/chtml/part05/sect_6.2.html#sect_6.2.1.2, or, in pydicom 2.2.0 or later, use the pydicom.valuerep.PersonName.from_named_components() method to construct the person name correctly. If a single-component name is really intended, add a trailing caret character to disambiguate the name.\n", - " check_person_name(patient_name)\n", - "[2026-03-11 20:29:26,154] [INFO] (highdicom.base) - copy Image-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2026-03-11 20:29:26,154] [INFO] (highdicom.base) - copy attributes of module \"Specimen\"\n", - "[2026-03-11 20:29:26,154] [INFO] (highdicom.base) - copy Patient-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2026-03-11 20:29:26,154] [INFO] (highdicom.base) - copy attributes of module \"Patient\"\n", - "[2026-03-11 20:29:26,154] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Subject\"\n", - "[2026-03-11 20:29:26,154] [INFO] (highdicom.base) - copy Study-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2026-03-11 20:29:26,154] [INFO] (highdicom.base) - copy attributes of module \"General Study\"\n", - "[2026-03-11 20:29:26,154] [INFO] (highdicom.base) - copy attributes of module \"Patient Study\"\n", - "[2026-03-11 20:29:26,155] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Study\"\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:405] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:435] Scheduler finished.\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2814] Deactivating Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2823] Graph execution finished.\n", - "[2026-03-11 20:29:26,243] [INFO] (app.AISpleenSegApp) - End run\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:536] Destroying context\n" - ] - } - ], + "outputs": [], "source": [ "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", "!python my_app" @@ -1415,26 +908,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "output:\n", - "1.2.826.0.1.3680043.10.511.3.87292339908616607598425079805316796.dcm\n", - "saved_images_folder\n", - "\n", - "output/saved_images_folder:\n", - "1.3.6.1.4.1.14519.5.2.1.7085.2626\n", - "\n", - "output/saved_images_folder/1.3.6.1.4.1.14519.5.2.1.7085.2626:\n", - "1.3.6.1.4.1.14519.5.2.1.7085.2626.nii\n", - "1.3.6.1.4.1.14519.5.2.1.7085.2626_seg.nii\n" - ] - } - ], + "outputs": [], "source": [ "!ls -R $HOLOSCAN_OUTPUT_PATH" ] @@ -1457,17 +933,9 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing my_app/app.yaml\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile my_app/app.yaml\n", "%YAML 1.2\n", @@ -1487,17 +955,9 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing my_app/requirements.txt\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile my_app/requirements.txt\n", "highdicom>=0.18.2\n", @@ -1525,556 +985,21 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2026-03-11 20:29:28,143] [INFO] (common) - Downloading CLI manifest file from https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/refs/heads/main/releases/4.0.0/artifacts.json...\n", - "[2026-03-11 20:29:28,337] [DEBUG] (common) - Validating CLI manifest file...\n", - "[2026-03-11 20:29:28,340] [INFO] (packager.parameters) - Application: /home/mqin/src/md-app-sdk/notebooks/tutorials/my_app\n", - "[2026-03-11 20:29:28,341] [INFO] (packager.parameters) - Detected application type: Python Module\n", - "[2026-03-11 20:29:28,341] [INFO] (packager) - Scanning for models in /home/mqin/src/md-app-sdk/notebooks/tutorials/models...\n", - "[2026-03-11 20:29:28,341] [DEBUG] (packager) - Model model=/home/mqin/src/md-app-sdk/notebooks/tutorials/models/model added.\n", - "[2026-03-11 20:29:28,342] [INFO] (packager) - Reading application configuration from /home/mqin/src/md-app-sdk/notebooks/tutorials/my_app/app.yaml...\n", - "[2026-03-11 20:29:28,346] [INFO] (packager) - Generating app.json...\n", - "[2026-03-11 20:29:28,346] [INFO] (packager) - Generating pkg.json...\n", - "[2026-03-11 20:29:28,411] [DEBUG] (common) - \n", - "=============== Begin app.json ===============\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"command\": \"[\\\"python3\\\", \\\"/opt/holoscan/app\\\"]\",\n", - " \"environment\": {\n", - " \"HOLOSCAN_APPLICATION\": \"/opt/holoscan/app\",\n", - " \"HOLOSCAN_INPUT_PATH\": \"input/\",\n", - " \"HOLOSCAN_OUTPUT_PATH\": \"output/\",\n", - " \"HOLOSCAN_WORKDIR\": \"/var/holoscan\",\n", - " \"HOLOSCAN_MODEL_PATH\": \"/opt/holoscan/models\",\n", - " \"HOLOSCAN_CONFIG_PATH\": \"/var/holoscan/app.yaml\",\n", - " \"HOLOSCAN_APP_MANIFEST_PATH\": \"/etc/holoscan/app.json\",\n", - " \"HOLOSCAN_PKG_MANIFEST_PATH\": \"/etc/holoscan/pkg.json\",\n", - " \"HOLOSCAN_DOCS_PATH\": \"/opt/holoscan/docs\",\n", - " \"HOLOSCAN_LOGS_PATH\": \"/var/holoscan/logs\"\n", - " },\n", - " \"input\": {\n", - " \"path\": \"input/\",\n", - " \"formats\": null\n", - " },\n", - " \"liveness\": null,\n", - " \"output\": {\n", - " \"path\": \"output/\",\n", - " \"formats\": null\n", - " },\n", - " \"readiness\": null,\n", - " \"sdk\": \"monai-deploy\",\n", - " \"sdkVersion\": \"1.0.0\",\n", - " \"timeout\": 0,\n", - " \"version\": 1.0,\n", - " \"workingDirectory\": \"/var/holoscan\"\n", - "}\n", - "================ End app.json ================\n", - " \n", - "[2026-03-11 20:29:28,411] [DEBUG] (common) - \n", - "=============== Begin pkg.json ===============\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"applicationRoot\": \"/opt/holoscan/app\",\n", - " \"modelRoot\": \"/opt/holoscan/models\",\n", - " \"models\": {\n", - " \"model\": \"/opt/holoscan/models/model\"\n", - " },\n", - " \"resources\": {\n", - " \"cpu\": 1,\n", - " \"gpu\": 1,\n", - " \"memory\": \"1Gi\",\n", - " \"gpuMemory\": \"6Gi\"\n", - " },\n", - " \"version\": 1.0,\n", - " \"platformConfig\": \"dgpu\"\n", - "}\n", - "================ End pkg.json ================\n", - " \n", - "[2026-03-11 20:29:28,427] [DEBUG] (packager.builder) - ================ Begin requirements.txt ================\n", - "[2026-03-11 20:29:28,427] [DEBUG] (packager.builder) - highdicom>=0.18.2\n", - "[2026-03-11 20:29:28,427] [DEBUG] (packager.builder) - monai>=1.0\n", - "[2026-03-11 20:29:28,427] [DEBUG] (packager.builder) - nibabel>=3.2.1\n", - "[2026-03-11 20:29:28,427] [DEBUG] (packager.builder) - numpy>=1.21.6\n", - "[2026-03-11 20:29:28,427] [DEBUG] (packager.builder) - pydicom>=2.3.0\n", - "[2026-03-11 20:29:28,427] [DEBUG] (packager.builder) - setuptools>=59.5.0 # for pkg_resources\n", - "[2026-03-11 20:29:28,427] [DEBUG] (packager.builder) - SimpleITK>=2.0.0\n", - "[2026-03-11 20:29:28,427] [DEBUG] (packager.builder) - torch>=1.12.0\n", - "[2026-03-11 20:29:28,428] [DEBUG] (packager.builder) - \n", - "[2026-03-11 20:29:28,428] [DEBUG] (packager.builder) - ================ End requirements.txt ==================\n", - "[2026-03-11 20:29:28,428] [DEBUG] (packager.builder) - \n", - "========== Begin Build Parameters ==========\n", - "{'add_hosts': None,\n", - " 'additional_lib_paths': '',\n", - " 'app_config_file_path': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/my_app/app.yaml'),\n", - " 'app_dir': PosixPath('/opt/holoscan/app'),\n", - " 'app_json': '/etc/holoscan/app.json',\n", - " 'application': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/my_app'),\n", - " 'application_directory': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/my_app'),\n", - " 'application_type': 'PythonModule',\n", - " 'build_cache': PosixPath('/home/mqin/.holoscan_build_cache'),\n", - " 'cmake_args': '',\n", - " 'command': '[\"python3\", \"/opt/holoscan/app\"]',\n", - " 'command_filename': 'my_app',\n", - " 'config_file_path': PosixPath('/var/holoscan/app.yaml'),\n", - " 'docs_dir': PosixPath('/opt/holoscan/docs'),\n", - " 'full_input_path': PosixPath('/var/holoscan/input'),\n", - " 'full_output_path': PosixPath('/var/holoscan/output'),\n", - " 'gid': 1000,\n", - " 'holoscan_sdk_version': '4.0.0',\n", - " 'includes': [],\n", - " 'input_data': None,\n", - " 'input_dir': 'input/',\n", - " 'lib_dir': PosixPath('/opt/holoscan/lib'),\n", - " 'logs_dir': PosixPath('/var/holoscan/logs'),\n", - " 'models': {'model': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/models/model')},\n", - " 'models_dir': PosixPath('/opt/holoscan/models'),\n", - " 'monai_deploy_app_sdk_version': '1.0.0',\n", - " 'no_cache': False,\n", - " 'output_dir': 'output/',\n", - " 'pip_packages': None,\n", - " 'pkg_json': '/etc/holoscan/pkg.json',\n", - " 'requirements_file_path': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/my_app/requirements.txt'),\n", - " 'sdk': ,\n", - " 'sdk_type': 'monai-deploy',\n", - " 'tarball_output': None,\n", - " 'timeout': 0,\n", - " 'title': 'MONAI Deploy App Package - MONAI Bundle AI App',\n", - " 'uid': 1000,\n", - " 'username': 'holoscan',\n", - " 'version': 1.0,\n", - " 'working_dir': PosixPath('/var/holoscan')}\n", - "=========== End Build Parameters ===========\n", - "\n", - "[2026-03-11 20:29:28,428] [DEBUG] (packager.builder) - \n", - "========== Begin Platform Parameters ==========\n", - "{'base_image': 'nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04',\n", - " 'build_image': None,\n", - " 'cuda_deb_arch': 'x86_64',\n", - " 'cuda_version': 13,\n", - " 'custom_base_image': False,\n", - " 'custom_holoscan_sdk': False,\n", - " 'custom_monai_deploy_sdk': True,\n", - " 'gpu_type': 'dgpu',\n", - " 'holoscan_deb_arch': 'amd64',\n", - " 'holoscan_sdk_file': '4.0.0',\n", - " 'holoscan_sdk_filename': '4.0.0',\n", - " 'monai_deploy_sdk_file': PosixPath('/home/mqin/src/md-app-sdk/dist/monai_deploy_app_sdk-1.0.0+53.gb23278b.dirty-py3-none-any.whl'),\n", - " 'monai_deploy_sdk_filename': 'monai_deploy_app_sdk-1.0.0+53.gb23278b.dirty-py3-none-any.whl',\n", - " 'tag': 'my_app:1.0',\n", - " 'target_arch': 'x86_64'}\n", - "=========== End Platform Parameters ===========\n", - "\n", - "[2026-03-11 20:29:28,444] [DEBUG] (packager.builder) - \n", - "========== Begin Dockerfile ==========\n", - "# SPDX-FileCopyrightText: Copyright (c) 2023-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n", - "# SPDX-License-Identifier: Apache-2.0\n", - "#\n", - "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "# you may not use this file except in compliance with the License.\n", - "# You may obtain a copy of the License at\n", - "#\n", - "# http://www.apache.org/licenses/LICENSE-2.0\n", - "#\n", - "# Unless required by applicable law or agreed to in writing, software\n", - "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", - "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", - "# See the License for the specific language governing permissions and\n", - "# limitations under the License.\n", - "\n", - "ARG GPU_TYPE=dgpu\n", - "ARG LIBTORCH_VERSION_ARM64=\"2.9.0.dev20250828+cu130\"\n", - "ARG LIBTORCH_VERSION_AMD64=\"2.9.0.dev20250829+cu130\"\n", - "ARG LIBTORCH_VISION_VERSION=\"0.24.0.dev20250829\"\n", - "\n", - "\n", - "\n", - "\n", - "FROM nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04 AS base\n", - "\n", - "RUN apt-get update \\\n", - " && apt-get install -y --no-install-recommends --no-install-suggests \\\n", - " curl \\\n", - " jq \\\n", - " && rm -rf /var/lib/apt/lists/*\n", - "\n", - "\n", - "FROM base AS release\n", - "ENV DEBIAN_FRONTEND=noninteractive\n", - "ENV TERM=xterm-256color\n", - "\n", - "ARG GPU_TYPE\n", - "ARG UNAME\n", - "ARG UID\n", - "ARG GID\n", - "ARG LIBTORCH_VERSION_ARM64\n", - "ARG LIBTORCH_VERSION_AMD64\n", - "ARG LIBTORCH_VISION_VERSION\n", - "\n", - "RUN mkdir -p /etc/holoscan/ \\\n", - " && mkdir -p /opt/holoscan/ \\\n", - " && mkdir -p /var/holoscan \\\n", - " && mkdir -p /opt/holoscan/app \\\n", - " && mkdir -p /var/holoscan/input \\\n", - " && mkdir -p /var/holoscan/output\n", - "\n", - "LABEL base=\"nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04\"\n", - "LABEL tag=\"my_app:1.0\"\n", - "LABEL org.opencontainers.image.title=\"MONAI Deploy App Package - MONAI Bundle AI App\"\n", - "LABEL org.opencontainers.image.version=\"1.0\"\n", - "LABEL org.nvidia.holoscan=\"4.0.0\"\n", - "\n", - "LABEL org.monai.deploy.app-sdk=\"1.0.0\"\n", - "\n", - "ENV HOLOSCAN_INPUT_PATH=/var/holoscan/input\n", - "ENV HOLOSCAN_OUTPUT_PATH=/var/holoscan/output\n", - "ENV HOLOSCAN_WORKDIR=/var/holoscan\n", - "ENV HOLOSCAN_APPLICATION=/opt/holoscan/app\n", - "ENV HOLOSCAN_TIMEOUT=0\n", - "ENV HOLOSCAN_MODEL_PATH=/opt/holoscan/models\n", - "ENV HOLOSCAN_DOCS_PATH=/opt/holoscan/docs\n", - "ENV HOLOSCAN_CONFIG_PATH=/var/holoscan/app.yaml\n", - "ENV HOLOSCAN_APP_MANIFEST_PATH=/etc/holoscan/app.json\n", - "ENV HOLOSCAN_PKG_MANIFEST_PATH=/etc/holoscan/pkg.json\n", - "ENV HOLOSCAN_LOGS_PATH=/var/holoscan/logs\n", - "ENV HOLOSCAN_VERSION=4.0.0\n", - "\n", - "# Update NV GPG repo key\n", - "# https://developer.nvidia.com/blog/updating-the-cuda-linux-gpg-repository-key/\n", - "RUN rm -f /etc/apt/sources.list.d/cuda*.list \\\n", - " && curl -OL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb \\\n", - " && dpkg -i cuda-keyring_1.1-1_all.deb \\\n", - " && rm -f cuda-keyring_1.1-1_all.deb \\\n", - " && apt-get update\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "# If torch is installed, we can skip installing Python\n", - "ENV PYTHON_VERSION=3.12.3-*\n", - "ENV PYTHON_PIP_VERSION=24.0+dfsg-*\n", - "\n", - "RUN apt update \\\n", - " && apt-get install -y --no-install-recommends --no-install-suggests \\\n", - " python3-minimal=${PYTHON_VERSION} \\\n", - " libpython3-stdlib=${PYTHON_VERSION} \\\n", - " python3=${PYTHON_VERSION} \\\n", - " python3-venv=${PYTHON_VERSION} \\\n", - " python3-pip=${PYTHON_PIP_VERSION} \\\n", - " && rm -rf /var/lib/apt/lists/*\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "RUN if id \"ubuntu\" >/dev/null 2>&1; then touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu; fi\n", - "RUN groupadd -f -g $GID $UNAME\n", - "RUN useradd -rm -d /home/$UNAME -s /bin/bash -g $GID -G sudo -u $UID $UNAME\n", - "RUN chown -R holoscan /var/holoscan && \\\n", - " chown -R holoscan /var/holoscan/input && \\\n", - " chown -R holoscan /var/holoscan/output\n", - "\n", - "# Set the working directory\n", - "WORKDIR /var/holoscan\n", - "\n", - "# Copy HAP/MAP tool script\n", - "COPY ./tools /var/holoscan/tools\n", - "RUN chmod +x /var/holoscan/tools\n", - "\n", - "# Remove EXTERNALLY-MANAGED directory\n", - "RUN rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED\n", - "\n", - "# Set the working directory\n", - "WORKDIR /var/holoscan\n", - "\n", - "USER $UNAME\n", - "\n", - "ENV PATH=/home/${UNAME}/.local/bin:/opt/nvidia/holoscan/bin:$PATH\n", - "ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/${UNAME}/.local/lib/python3.12/site-packages/holoscan/lib\n", - "\n", - "COPY ./pip/requirements.txt /tmp/requirements.txt\n", - "\n", - "RUN pip install --upgrade pip\n", - "RUN pip install --no-cache-dir --user -r /tmp/requirements.txt\n", - "\n", - "\n", - "# Install MONAI Deploy App SDK\n", - "# Copy user-specified MONAI Deploy SDK file\n", - "COPY ./monai_deploy_app_sdk-1.0.0+53.gb23278b.dirty-py3-none-any.whl /tmp/monai_deploy_app_sdk-1.0.0+53.gb23278b.dirty-py3-none-any.whl\n", - "RUN pip install /tmp/monai_deploy_app_sdk-1.0.0+53.gb23278b.dirty-py3-none-any.whl\n", - "\n", - "COPY ./models /opt/holoscan/models\n", - "\n", - "\n", - "COPY ./map/app.json /etc/holoscan/app.json\n", - "COPY ./app.config /var/holoscan/app.yaml\n", - "COPY ./map/pkg.json /etc/holoscan/pkg.json\n", - "\n", - "COPY ./app /opt/holoscan/app\n", - "\n", - "\n", - "\n", - "ENTRYPOINT [\"/var/holoscan/tools\"]\n", - "=========== End Dockerfile ===========\n", - "\n", - "[2026-03-11 20:29:28,444] [DEBUG] (python_on_whales.utils) - Running command: /usr/bin/docker buildx ls --format '{{json . }}'\n", - "[2026-03-11 20:29:28,854] [INFO] (common) - Using existing Docker BuildKit builder `holoscan_app_builder`\n", - "[2026-03-11 20:29:28,854] [DEBUG] (packager.builder) - Building Holoscan Application Package: tag=my_app-x64-workstation-dgpu-linux-amd64:1.0\n", - "[2026-03-11 20:29:28,854] [INFO] (packager.builder) - \n", - "===============================================================================\n", - "Building image for: x64-workstation\n", - " Architecture: linux/amd64\n", - " Base Image: nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04\n", - " Build Image: N/A\n", - " CUDA Version: 13\n", - " Cache: Enabled\n", - " Configuration: dgpu\n", - " Holoscan SDK Package: 4.0.0\n", - " MONAI Deploy App SDK Package: /home/mqin/src/md-app-sdk/dist/monai_deploy_app_sdk-1.0.0+53.gb23278b.dirty-py3-none-any.whl\n", - " gRPC Health Probe: N/A\n", - " SDK Version: 4.0.0\n", - " SDK: monai-deploy\n", - " Tag: my_app-x64-workstation-dgpu-linux-amd64:1.0\n", - " Included features/dependencies: N/A\n", - " \n", - "[2026-03-11 20:29:28,855] [DEBUG] (python_on_whales.utils) - Running command: /usr/bin/docker buildx inspect holoscan_app_builder\n", - "[2026-03-11 20:29:29,044] [DEBUG] (python_on_whales.utils) - Running command: /usr/bin/docker buildx ls --format '{{json . }}'\n", - "[2026-03-11 20:29:29,292] [DEBUG] (python_on_whales.utils) - Running command: /usr/bin/docker buildx build --progress plain --build-arg UID=1000 --build-arg GID=1000 --build-arg UNAME=holoscan --build-arg GPU_TYPE=dgpu --builder holoscan_app_builder --pull --load --file /tmp/holoscan_tmpz61833l2/Dockerfile --cache-from type=local,src=/home/mqin/.holoscan_build_cache --cache-from type=registry,ref=nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04 --cache-to type=local,dest=/home/mqin/.holoscan_build_cache --platform linux/amd64 --tag my_app-x64-workstation-dgpu-linux-amd64:1.0 /tmp/holoscan_tmpz61833l2\n", - "#0 building with \"holoscan_app_builder\" instance using docker-container driver\n", - "\n", - "#1 [internal] load build definition from Dockerfile\n", - "#1 transferring dockerfile: 4.70kB done\n", - "#1 DONE 0.1s\n", - "\n", - "#2 [auth] nvidia/cuda:pull token for nvcr.io\n", - "#2 DONE 0.0s\n", - "\n", - "#3 [internal] load metadata for nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04\n", - "#3 DONE 0.8s\n", - "\n", - "#4 [internal] load .dockerignore\n", - "#4 transferring context: 1.80kB done\n", - "#4 DONE 0.1s\n", - "\n", - "#5 importing cache manifest from local:7403098079264450286\n", - "#5 inferred cache manifest type: application/vnd.oci.image.index.v1+json done\n", - "#5 DONE 0.0s\n", - "\n", - "#6 [internal] load build context\n", - "#6 DONE 0.0s\n", - "\n", - "#7 [base 1/2] FROM nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04@sha256:95318efecfd68ab3d109da5277863257b06137c84f34a87f38de970d5cd035d3\n", - "#7 resolve nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04@sha256:95318efecfd68ab3d109da5277863257b06137c84f34a87f38de970d5cd035d3 0.0s done\n", - "#7 DONE 0.0s\n", - "\n", - "#8 importing cache manifest from nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04\n", - "#8 inferred cache manifest type: application/vnd.docker.distribution.manifest.list.v2+json done\n", - "#8 DONE 0.4s\n", - "\n", - "#6 [internal] load build context\n", - "#6 transferring context: 19.59MB 0.1s done\n", - "#6 DONE 0.2s\n", - "\n", - "#9 [release 9/22] COPY ./tools /var/holoscan/tools\n", - "#9 CACHED\n", - "\n", - "#10 [release 5/22] RUN groupadd -f -g 1000 holoscan\n", - "#10 CACHED\n", - "\n", - "#11 [release 13/22] COPY ./pip/requirements.txt /tmp/requirements.txt\n", - "#11 CACHED\n", - "\n", - "#12 [release 3/22] RUN apt update && apt-get install -y --no-install-recommends --no-install-suggests python3-minimal=3.12.3-* libpython3-stdlib=3.12.3-* python3=3.12.3-* python3-venv=3.12.3-* python3-pip=24.0+dfsg-* && rm -rf /var/lib/apt/lists/*\n", - "#12 CACHED\n", - "\n", - "#13 [release 7/22] RUN chown -R holoscan /var/holoscan && chown -R holoscan /var/holoscan/input && chown -R holoscan /var/holoscan/output\n", - "#13 CACHED\n", - "\n", - "#14 [release 8/22] WORKDIR /var/holoscan\n", - "#14 CACHED\n", - "\n", - "#15 [release 16/22] COPY ./monai_deploy_app_sdk-1.0.0+53.gb23278b.dirty-py3-none-any.whl /tmp/monai_deploy_app_sdk-1.0.0+53.gb23278b.dirty-py3-none-any.whl\n", - "#15 CACHED\n", - "\n", - "#16 [release 6/22] RUN useradd -rm -d /home/holoscan -s /bin/bash -g 1000 -G sudo -u 1000 holoscan\n", - "#16 CACHED\n", - "\n", - "#17 [release 4/22] RUN if id \"ubuntu\" >/dev/null 2>&1; then touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu; fi\n", - "#17 CACHED\n", - "\n", - "#18 [release 1/22] RUN mkdir -p /etc/holoscan/ && mkdir -p /opt/holoscan/ && mkdir -p /var/holoscan && mkdir -p /opt/holoscan/app && mkdir -p /var/holoscan/input && mkdir -p /var/holoscan/output\n", - "#18 CACHED\n", - "\n", - "#19 [release 2/22] RUN rm -f /etc/apt/sources.list.d/cuda*.list && curl -OL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb && dpkg -i cuda-keyring_1.1-1_all.deb && rm -f cuda-keyring_1.1-1_all.deb && apt-get update\n", - "#19 CACHED\n", - "\n", - "#20 [release 10/22] RUN chmod +x /var/holoscan/tools\n", - "#20 CACHED\n", - "\n", - "#21 [release 14/22] RUN pip install --upgrade pip\n", - "#21 CACHED\n", - "\n", - "#22 [release 11/22] RUN rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED\n", - "#22 CACHED\n", - "\n", - "#23 [release 12/22] WORKDIR /var/holoscan\n", - "#23 CACHED\n", - "\n", - "#24 [release 15/22] RUN pip install --no-cache-dir --user -r /tmp/requirements.txt\n", - "#24 CACHED\n", - "\n", - "#25 [base 2/2] RUN apt-get update && apt-get install -y --no-install-recommends --no-install-suggests curl jq && rm -rf /var/lib/apt/lists/*\n", - "#25 CACHED\n", - "\n", - "#26 [release 17/22] RUN pip install /tmp/monai_deploy_app_sdk-1.0.0+53.gb23278b.dirty-py3-none-any.whl\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 6.29MB / 4.29GB 0.2s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 224.40MB / 4.29GB 3.8s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 444.60MB / 4.29GB 7.8s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 661.65MB / 4.29GB 11.6s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 876.61MB / 4.29GB 15.9s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 1.10GB / 4.29GB 19.8s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 1.32GB / 4.29GB 23.6s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 1.53GB / 4.29GB 27.3s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 1.75GB / 4.29GB 31.1s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 1.97GB / 4.29GB 34.7s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 2.19GB / 4.29GB 39.3s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 2.41GB / 4.29GB 43.5s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 2.62GB / 4.29GB 47.0s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 2.84GB / 4.29GB 50.3s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 3.06GB / 4.29GB 53.7s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 3.28GB / 4.29GB 57.3s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 3.50GB / 4.29GB 61.2s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 3.71GB / 4.29GB 65.4s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 3.93GB / 4.29GB 69.5s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 4.15GB / 4.29GB 73.1s\n", - "#26 sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 4.29GB / 4.29GB 76.8s done\n", - "#26 extracting sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47\n", - "#26 extracting sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 95.5s done\n", - "#26 sha256:06a61c5ac02a820f46630392298270eae43b734a466a70e5ace0b84f0555de98 149.98kB / 149.98kB 0.0s done\n", - "#26 extracting sha256:06a61c5ac02a820f46630392298270eae43b734a466a70e5ace0b84f0555de98\n", - "#26 extracting sha256:06a61c5ac02a820f46630392298270eae43b734a466a70e5ace0b84f0555de98 0.0s done\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 9.44MB / 383.72MB 0.2s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 37.75MB / 383.72MB 0.6s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 66.06MB / 383.72MB 1.1s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 93.32MB / 383.72MB 1.5s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 122.68MB / 383.72MB 2.0s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 150.99MB / 383.72MB 2.4s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 179.31MB / 383.72MB 2.9s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 200.28MB / 383.72MB 3.2s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 226.49MB / 383.72MB 3.6s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 254.80MB / 383.72MB 4.1s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 274.73MB / 383.72MB 4.4s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 303.04MB / 383.72MB 4.8s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 331.35MB / 383.72MB 5.3s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 358.61MB / 383.72MB 5.7s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 383.72MB / 383.72MB 6.2s\n", - "#26 sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 383.72MB / 383.72MB 6.9s done\n", - "#26 extracting sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae\n", - "#26 extracting sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae 9.6s done\n", - "#26 CACHED\n", - "\n", - "#27 [release 18/22] COPY ./models /opt/holoscan/models\n", - "#27 DONE 1.6s\n", - "\n", - "#28 [release 19/22] COPY ./map/app.json /etc/holoscan/app.json\n", - "#28 DONE 0.1s\n", - "\n", - "#29 [release 20/22] COPY ./app.config /var/holoscan/app.yaml\n", - "#29 DONE 0.1s\n", - "\n", - "#30 [release 21/22] COPY ./map/pkg.json /etc/holoscan/pkg.json\n", - "#30 DONE 0.1s\n", - "\n", - "#31 [release 22/22] COPY ./app /opt/holoscan/app\n", - "#31 DONE 0.1s\n", - "\n", - "#32 exporting to docker image format\n", - "#32 exporting layers\n", - "#32 exporting layers 0.9s done\n", - "#32 exporting manifest sha256:c4564541c2865acb7f3c2c9146b02afc54f5f82b8781057f22f9e986b73780b3 0.0s done\n", - "#32 exporting config sha256:ea88bf479b765c17de2659278502a57949058feeb4c2a699c41f1253c1d0ef30 0.0s done\n", - "#32 sending tarball\n", - "#32 ...\n", - "\n", - "#33 importing to docker\n", - "#33 loading layer 867e7cf98ed3 196.61kB / 17.81MB\n", - "#33 loading layer 3f668750f14c 487B / 487B\n", - "#33 loading layer 080b89467522 315B / 315B\n", - "#33 loading layer 53b98c8eef4d 301B / 301B\n", - "#33 loading layer 56d987acb0b9 3.91kB / 3.91kB\n", - "#33 loading layer 53b98c8eef4d 301B / 301B 0.9s done\n", - "#33 loading layer 867e7cf98ed3 17.81MB / 17.81MB 1.4s done\n", - "#33 loading layer 3f668750f14c 487B / 487B 1.0s done\n", - "#33 loading layer 080b89467522 315B / 315B 0.9s done\n", - "#33 loading layer 56d987acb0b9 3.91kB / 3.91kB 0.8s done\n", - "#33 DONE 1.4s\n", - "\n", - "#32 exporting to docker image format\n", - "#32 sending tarball 62.1s done\n", - "#32 DONE 63.1s\n", - "\n", - "#34 exporting cache to client directory\n", - "#34 preparing build cache for export\n", - "#34 writing layer sha256:0159c468e65d2869d2e2b897d80350cfdeda6c8f205901cc74798f2471d6fbc3\n", - "#34 writing layer sha256:0159c468e65d2869d2e2b897d80350cfdeda6c8f205901cc74798f2471d6fbc3 done\n", - "#34 writing layer sha256:06a61c5ac02a820f46630392298270eae43b734a466a70e5ace0b84f0555de98 done\n", - "#34 writing layer sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 done\n", - "#34 writing layer sha256:11a76e332632d8a6490375755830c082c102ed5e58b55c4c911c75f4954adf82 done\n", - "#34 writing layer sha256:13e8f87efde86df96bfe73da211eb196d0416702b69d92947ec617138e6db64b done\n", - "#34 writing layer sha256:17474576fa558361aa1a145b2b3434eab2266a715f5fb2c4dfca7da0f87cbabe 0.0s done\n", - "#34 writing layer sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 done\n", - "#34 writing layer sha256:296b01d98e848d3f644e50ac63132361ff2e4be2843bc17a2fdcfe605d1cf061 0.0s done\n", - "#34 writing layer sha256:32f112e3802cadcab3543160f4d2aa607b3cc1c62140d57b4f5441384f40e927 done\n", - "#34 writing layer sha256:374fd1c58339c34f21311e77f68d1240e615a354b111521256e8d4bee6c2caae done\n", - "#34 writing layer sha256:37936fece0c0b1736461b5635bb698952105bb3e002bb52e3c2e221184cdb09a done\n", - "#34 writing layer sha256:3df97a42162e2c78380b01bd405ef5a0b0310ccc8cfcdd69ee34d710e8e2a1c3 done\n", - "#34 writing layer sha256:492db7b3e492442f7a1ad30fea534f61ad89da451c675ccab2488e41034d0886 done\n", - "#34 writing layer sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 done\n", - "#34 writing layer sha256:59e943431d4ba8eca816e4af50a78d68a5adbfbaa5441f574b9d049861fc0cce\n", - "#34 writing layer sha256:59e943431d4ba8eca816e4af50a78d68a5adbfbaa5441f574b9d049861fc0cce 0.5s done\n", - "#34 writing layer sha256:61a9c70e6cfb0daf525ecab63f579392d6fb4b3d88b0f6532e7f712c39732286\n", - "#34 writing layer sha256:61a9c70e6cfb0daf525ecab63f579392d6fb4b3d88b0f6532e7f712c39732286 done\n", - "#34 writing layer sha256:62805ef1f2bf34829faf303fcd27e45286335e8e5c9881ec68930fab206bbe47 done\n", - "#34 writing layer sha256:73b67fa4c61a8857e8a967d98a3b8ceb8aa9ae2d8b38c0411ecc0f3fe1175648 done\n", - "#34 writing layer sha256:76806732f43ec63edb55fe3b9d0526f939ba47cc07617b8c026b2f38b21f73e5 done\n", - "#34 writing layer sha256:84fef9f1ca4f21e9c7411db3c57fe91a1f401d7051d87a3bfed97ff70a2cf72c done\n", - "#34 writing layer sha256:85c4bb1e2a612949068a518d0ab398f3507796ff4ad2eb8d6d46743016719bba done\n", - "#34 writing layer sha256:90566166317e45b45c797b64d1ccc398f930626a634d45828cf58bf8c5a7278e 0.0s done\n", - "#34 writing layer sha256:932162d4fcf6e1094ee1544e8fde0ae2a02b2c4e9545f64f373ce3a4479189e6 done\n", - "#34 writing layer sha256:9c9b39ad83d512d5af47e9c22f4458cb586f05ea478656a372c5e739cb7280e5 done\n", - "#34 writing layer sha256:a3242f3d6a61eca84b700dc0aaa8eb8931d9fa7dadbad75d68cb4f3f00fdfd5b done\n", - "#34 writing layer sha256:a654c7a26f8bc9a9fb5a4a4645899610a79dd293f693a17058fa242c70e08aac done\n", - "#34 writing layer sha256:ac8cf09ebaa66b90399f957cd09af23f15e17c35bd044956e305af9405ec6daf done\n", - "#34 writing layer sha256:b3a9482d0f242a0952b386dbb9c652483d3c0da982119740e646008c9679c4e0 done\n", - "#34 writing layer sha256:ddc61996788ff6833bbe82138d6fc5000e848953b90df5055cbae21479218914 done\n", - "#34 writing layer sha256:e45b49be70e2a73636f42ab354f27bf63086a424fb6d68f17767fc62e67dca95 0.0s done\n", - "#34 writing layer sha256:f5d48a0adf9dc21101b7564f069dafe49b086e98177daa393944536075c0a810 done\n", - "#34 writing config sha256:0ed644c56a57c9591e90e720752b4747783eb09f93e3a9f12f9b688efc6140a9 0.0s done\n", - "#34 preparing build cache for export 0.9s done\n", - "#34 writing cache manifest sha256:3604b30ca2bb8c6f45a298f951b0d8c7016939605aafbe9ee6dbf42aac13bc64 0.0s done\n", - "#34 DONE 0.9s\n", - "[2026-03-11 20:33:48,428] [DEBUG] (python_on_whales.utils) - Running command: /usr/bin/docker image inspect my_app-x64-workstation-dgpu-linux-amd64:1.0\n", - "[2026-03-11 20:33:48,517] [INFO] (packager) - Build Summary:\n", - "\n", - "Platform: x64-workstation/dgpu\n", - " Status: Succeeded\n", - " Docker Tag: my_app-x64-workstation-dgpu-linux-amd64:1.0\n", - " Tarball: None\n" - ] - } - ], + "outputs": [], "source": [ "tag_prefix = \"my_app\"\n", "\n", - "!monai-deploy package my_app -m {models_folder} -c my_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG" + "# holoscan-cli downloads packaging manifests from GitHub; use the release tag URL\n", + "# because the files are not kept on the main branch.\n", + "import holoscan_cli\n", + "\n", + "cli_version = holoscan_cli.__version__\n", + "manifest_url = (\n", + " f\"https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/\"\n", + " f\"v{cli_version}/releases/{cli_version}/artifacts-cu12.json\"\n", + ")\n", + "\n", + "!monai-deploy package my_app -m {models_folder} -c my_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12 --source {manifest_url}" ] }, { @@ -2088,18 +1013,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARNING: This output is designed for human readability. For machine-readable output, please use --format.\n", - "my_app-x64-workstation-dgpu-linux-amd64:1.0 ea88bf479b76 11.1GB 0B \n" - ] - } - ], + "outputs": [], "source": [ "!docker image ls | grep {tag_prefix}" ] @@ -2115,237 +1031,9 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "output\n", - "dcm\n", - "[2026-03-11 20:33:50,363] [INFO] (runner) - Checking dependencies...\n", - "[2026-03-11 20:33:50,363] [INFO] (runner) - --> Verifying if \"docker\" is installed...\n", - "\n", - "[2026-03-11 20:33:50,363] [INFO] (runner) - --> Verifying if \"docker-buildx\" is installed...\n", - "\n", - "[2026-03-11 20:33:50,363] [INFO] (runner) - --> Verifying if \"my_app-x64-workstation-dgpu-linux-amd64:1.0\" is available...\n", - "\n", - "[2026-03-11 20:33:50,438] [INFO] (runner) - Reading HAP/MAP manifest...\n", - "Successfully copied 2.56kB to /tmp/tmpl74414vq/app.json\n", - "Successfully copied 2.05kB to /tmp/tmpl74414vq/pkg.json\n", - "cd2d57677cf5c15f58d769cafd033104c217cc00e7be3eaf0cd104b1fcf461e5\n", - "[2026-03-11 20:33:51,086] [INFO] (runner) - --> Verifying if \"nvidia-ctk\" is installed...\n", - "\n", - "[2026-03-11 20:33:51,087] [INFO] (runner) - --> Verifying \"nvidia-ctk\" version...\n", - "\n", - "[2026-03-11 20:33:51,522] [INFO] (common) - Launching container (0051f9297644) using image 'my_app-x64-workstation-dgpu-linux-amd64:1.0'...\n", - " container name: suspicious_dubinsky\n", - " host name: mingq-dt\n", - " network: host\n", - " user: 1000:1000\n", - " ulimits: memlock=-1:-1, stack=67108864:67108864\n", - " cap_add: CAP_SYS_PTRACE\n", - " ipc mode: host\n", - " shared memory size: 67108864\n", - " devices: \n", - " group_add: 44\n", - "2026-03-12 03:33:52 [INFO] Launching application python3 /opt/holoscan/app ...\n", - "\n", - "[info] [fragment.cpp:1122] Loading extensions from configs...\n", - "\n", - "[info] [gxf_executor.cpp:501] Creating context\n", - "\n", - "[2026-03-12 03:33:58,201] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=['/opt/holoscan/app'])\n", - "\n", - "[2026-03-12 03:33:58,205] [INFO] (root) - AppContext object: AppContext(input_path=/var/holoscan/input, output_path=/var/holoscan/output, model_path=/opt/holoscan/models, workdir=/var/holoscan), triton_server_netloc=\n", - "\n", - "[2026-03-12 03:33:58,205] [INFO] (app.AISpleenSegApp) - App input and output path: /var/holoscan/input, /var/holoscan/output\n", - "\n", - "[2026-03-12 03:33:58,207] [WARNING] (monai.deploy.operators.decoder_nvimgcodec) - Module nvidia.nvimgcodec is not available.\n", - "\n", - "[2026-03-12 03:33:58,207] [WARNING] (root) - The nvimgcodec decoder plugin did not register successfully.\n", - "\n", - "[info] [gxf_executor.cpp:2664] Activating Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2805] Running Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2807] Waiting for completion...\n", - "\n", - "[info] [greedy_scheduler.cpp:191] Scheduling 5 entities\n", - "\n", - "[2026-03-12 03:33:58,369] [INFO] (monai.deploy.operators.dicom_data_loader_operator.DICOMDataLoaderOperator) - No or invalid input path from the optional input port: None\n", - "\n", - "[2026-03-12 03:33:59,235] [INFO] (root) - Finding series for Selection named: CT Series\n", - "\n", - "[2026-03-12 03:33:59,235] [INFO] (root) - Searching study, : 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291\n", - "\n", - " # of series: 1\n", - "\n", - "[2026-03-12 03:33:59,235] [INFO] (root) - Working on series, instance UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "\n", - "[2026-03-12 03:33:59,236] [INFO] (root) - On attribute: 'StudyDescription' to match value: '(.*?)'\n", - "\n", - "[2026-03-12 03:33:59,236] [INFO] (root) - Series attribute StudyDescription value: CT ABDOMEN W IV CONTRAST\n", - "\n", - "[2026-03-12 03:33:59,236] [INFO] (root) - On attribute: 'Modality' to match value: '(?i)CT'\n", - "\n", - "[2026-03-12 03:33:59,236] [INFO] (root) - Series attribute Modality value: CT\n", - "\n", - "[2026-03-12 03:33:59,236] [INFO] (root) - On attribute: 'SeriesDescription' to match value: '(.*?)'\n", - "\n", - "[2026-03-12 03:33:59,236] [INFO] (root) - Series attribute SeriesDescription value: ABD/PANC 3.0 B31f\n", - "\n", - "[2026-03-12 03:33:59,236] [INFO] (root) - On attribute: 'ImageType' to match value: ['PRIMARY', 'ORIGINAL']\n", - "\n", - "[2026-03-12 03:33:59,236] [INFO] (root) - Series attribute ImageType value: None\n", - "\n", - "[2026-03-12 03:33:59,236] [INFO] (root) - Instance level attribute ImageType value: [\"['ORIGINAL', 'PRIMARY', 'AXIAL', 'CT_SOM5 SPI']\"]\n", - "\n", - "[2026-03-12 03:33:59,236] [INFO] (root) - Selected Series, UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "\n", - "[2026-03-12 03:33:59,236] [INFO] (root) - Series Selection finalized\n", - "\n", - "[2026-03-12 03:33:59,236] [INFO] (root) - Series Description of selected DICOM Series for inference: ABD/PANC 3.0 B31f\n", - "\n", - "[2026-03-12 03:33:59,236] [INFO] (root) - Series Instance UID of selected DICOM Series for inference: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "\n", - "/home/holoscan/.local/lib/python3.12/site-packages/monai/utils/deprecate_utils.py:321: FutureWarning: monai.transforms.spatial.dictionary Orientationd.__init__:labels: Current default value of argument `labels=(('L', 'R'), ('P', 'A'), ('I', 'S'))` was changed in version None from `labels=(('L', 'R'), ('P', 'A'), ('I', 'S'))` to `labels=None`. Default value changed to None meaning that the transform now uses the 'space' of a meta-tensor, if applicable, to determine appropriate axis labels.\n", - "\n", - " warn_deprecated(argname, msg, warning_category)\n", - "\n", - "[2026-03-12 03:33:59,576] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Converted Image object metadata:\n", - "\n", - "[2026-03-12 03:33:59,576] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesInstanceUID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239, type \n", - "\n", - "[2026-03-12 03:33:59,576] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesDate: 20090831, type \n", - "\n", - "[2026-03-12 03:33:59,576] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesTime: 101721.452, type \n", - "\n", - "[2026-03-12 03:33:59,576] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Modality: CT, type \n", - "\n", - "[2026-03-12 03:33:59,576] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesDescription: ABD/PANC 3.0 B31f, type \n", - "\n", - "[2026-03-12 03:33:59,577] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - PatientPosition: HFS, type \n", - "\n", - "[2026-03-12 03:33:59,577] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesNumber: 8, type \n", - "\n", - "[2026-03-12 03:33:59,577] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - row_pixel_spacing: 0.7890625, type \n", - "\n", - "[2026-03-12 03:33:59,577] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - col_pixel_spacing: 0.7890625, type \n", - "\n", - "[2026-03-12 03:33:59,577] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - depth_pixel_spacing: 1.5, type \n", - "\n", - "[2026-03-12 03:33:59,577] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - row_direction_cosine: [1.0, 0.0, 0.0], type \n", - "\n", - "[2026-03-12 03:33:59,577] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - col_direction_cosine: [0.0, 1.0, 0.0], type \n", - "\n", - "[2026-03-12 03:33:59,577] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - depth_direction_cosine: [0.0, 0.0, 1.0], type \n", - "\n", - "[2026-03-12 03:33:59,578] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - dicom_affine_transform: [[ 0.7890625 0. 0. -197.60547 ]\n", - "\n", - " [ 0. 0.7890625 0. -398.60547 ]\n", - "\n", - " [ 0. 0. 1.5 -383. ]\n", - "\n", - " [ 0. 0. 0. 1. ]], type \n", - "\n", - "[2026-03-12 03:33:59,578] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - nifti_affine_transform: [[ -0.7890625 -0. -0. 197.60547 ]\n", - "\n", - " [ -0. -0.7890625 -0. 398.60547 ]\n", - "\n", - " [ 0. 0. 1.5 -383. ]\n", - "\n", - " [ 0. 0. 0. 1. ]], type \n", - "\n", - "[2026-03-12 03:33:59,578] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyInstanceUID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291, type \n", - "\n", - "[2026-03-12 03:33:59,578] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyID: , type \n", - "\n", - "[2026-03-12 03:33:59,578] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyDate: 20090831, type \n", - "\n", - "[2026-03-12 03:33:59,578] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyTime: 095948.599, type \n", - "\n", - "[2026-03-12 03:33:59,578] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyDescription: CT ABDOMEN W IV CONTRAST, type \n", - "\n", - "[2026-03-12 03:33:59,578] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - AccessionNumber: 5471978513296937, type \n", - "\n", - "[2026-03-12 03:33:59,578] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - selection_name: CT Series, type \n", - "\n", - "[2026-03-12 03:33:59,578] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - affine: [[ -0.7890625 -0. -0. 197.60547 ]\n", - "\n", - " [ -0. -0.7890625 -0. 398.60547 ]\n", - "\n", - " [ 0. 0. 1.5 -383. ]\n", - "\n", - " [ 0. 0. 0. 1. ]], type \n", - "\n", - "[2026-03-12 03:33:59,578] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - space: RAS, type \n", - "\n", - "2026-03-12 03:34:00,291 INFO image_writer.py:197 - writing: /var/holoscan/output/saved_images_folder/1.3.6.1.4.1.14519.5.2.1.7085.2626/1.3.6.1.4.1.14519.5.2.1.7085.2626.nii\n", - "\n", - "[2026-03-12 03:34:01,535] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Input of shape: torch.Size([1, 1, 270, 270, 106])\n", - "\n", - "/home/holoscan/.local/lib/python3.12/site-packages/monai/inferers/utils.py:226: UserWarning: Using a non-tuple sequence for multidimensional indexing is deprecated and will be changed in pytorch 2.9; use x[tuple(seq)] instead of x[seq]. In pytorch 2.9 this will be interpreted as tensor index, x[torch.tensor(seq)], which will result either in an error or a different result (Triggered internally at /pytorch/torch/csrc/autograd/python_variable_indexing.cpp:347.)\n", - "\n", - " win_data = torch.cat([inputs[win_slice] for win_slice in unravel_slice]).to(sw_device)\n", - "\n", - "/home/holoscan/.local/lib/python3.12/site-packages/monai/inferers/utils.py:370: UserWarning: Using a non-tuple sequence for multidimensional indexing is deprecated and will be changed in pytorch 2.9; use x[tuple(seq)] instead of x[seq]. In pytorch 2.9 this will be interpreted as tensor index, x[torch.tensor(seq)], which will result either in an error or a different result (Triggered internally at /pytorch/torch/csrc/autograd/python_variable_indexing.cpp:347.)\n", - "\n", - " out[idx_zm] += p\n", - "\n", - "2026-03-12 03:34:03,395 INFO image_writer.py:197 - writing: /var/holoscan/output/saved_images_folder/1.3.6.1.4.1.14519.5.2.1.7085.2626/1.3.6.1.4.1.14519.5.2.1.7085.2626_seg.nii\n", - "\n", - "[2026-03-12 03:34:03,849] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform length/batch size of output: 1\n", - "\n", - "[2026-03-12 03:34:03,854] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform pixel spacings for pred: tensor([0.7891, 0.7891, 1.5000], dtype=torch.float64)\n", - "\n", - "[2026-03-12 03:34:03,982] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform pred of shape: (1, 512, 512, 204)\n", - "\n", - "[2026-03-12 03:34:04,048] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Output Seg image numpy array of type shape: (204, 512, 512)\n", - "\n", - "[2026-03-12 03:34:04,052] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Output Seg image pixel max value: 1\n", - "\n", - "/home/holoscan/.local/lib/python3.12/site-packages/highdicom/base.py:181: UserWarning: The string \"C3N-00198\" is unlikely to represent the intended person name since it contains only a single component. Construct a person name according to the format in described in https://dicom.nema.org/dicom/2013/output/chtml/part05/sect_6.2.html#sect_6.2.1.2, or, in pydicom 2.2.0 or later, use the pydicom.valuerep.PersonName.from_named_components() method to construct the person name correctly. If a single-component name is really intended, add a trailing caret character to disambiguate the name.\n", - "\n", - " check_person_name(patient_name)\n", - "\n", - "[2026-03-12 03:34:04,958] [INFO] (highdicom.base) - copy Image-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "\n", - "[2026-03-12 03:34:04,958] [INFO] (highdicom.base) - copy attributes of module \"Specimen\"\n", - "\n", - "[2026-03-12 03:34:04,958] [INFO] (highdicom.base) - copy Patient-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "\n", - "[2026-03-12 03:34:04,958] [INFO] (highdicom.base) - copy attributes of module \"Patient\"\n", - "\n", - "[2026-03-12 03:34:04,959] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Subject\"\n", - "\n", - "[2026-03-12 03:34:04,959] [INFO] (highdicom.base) - copy Study-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "\n", - "[2026-03-12 03:34:04,959] [INFO] (highdicom.base) - copy attributes of module \"General Study\"\n", - "\n", - "[2026-03-12 03:34:04,959] [INFO] (highdicom.base) - copy attributes of module \"Patient Study\"\n", - "\n", - "[2026-03-12 03:34:04,959] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Study\"\n", - "\n", - "[info] [greedy_scheduler.cpp:405] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "\n", - "[info] [greedy_scheduler.cpp:435] Scheduler finished.\n", - "\n", - "[info] [gxf_executor.cpp:2814] Deactivating Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2823] Graph execution finished.\n", - "\n", - "[2026-03-12 03:34:05,044] [INFO] (app.AISpleenSegApp) - End run\n", - "\n", - "[info] [gxf_executor.cpp:536] Destroying context\n", - "\n", - "2026-03-12 03:34:06 [INFO] Application exited with 0.\n", - "\n", - "[2026-03-11 20:34:08,550] [INFO] (common) - Container 'suspicious_dubinsky'(0051f9297644) exited with code 0.\n" - ] - } - ], + "outputs": [], "source": [ "# Clear the output folder and run the MAP. The input is expected to be a folder.\n", "!echo $HOLOSCAN_OUTPUT_PATH\n", @@ -2356,26 +1044,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "output:\n", - "1.2.826.0.1.3680043.10.511.3.2550082828547898492567019146643118.dcm\n", - "saved_images_folder\n", - "\n", - "output/saved_images_folder:\n", - "1.3.6.1.4.1.14519.5.2.1.7085.2626\n", - "\n", - "output/saved_images_folder/1.3.6.1.4.1.14519.5.2.1.7085.2626:\n", - "1.3.6.1.4.1.14519.5.2.1.7085.2626.nii\n", - "1.3.6.1.4.1.14519.5.2.1.7085.2626_seg.nii\n" - ] - } - ], + "outputs": [], "source": [ "!ls -R $HOLOSCAN_OUTPUT_PATH" ] diff --git a/notebooks/tutorials/04_monai_bundle_app.ipynb b/notebooks/tutorials/04_monai_bundle_app.ipynb index b1613ca0..883625d8 100644 --- a/notebooks/tutorials/04_monai_bundle_app.ipynb +++ b/notebooks/tutorials/04_monai_bundle_app.ipynb @@ -1,2290 +1,848 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Creating a Deploy App with MONAI Deploy App SDK and MONAI Bundle\n", - "\n", - "This tutorial shows how to create an application for organ segmentation using a PyTorch model that has been trained with MONAI and packaged in the [MONAI Bundle](https://monai.readthedocs.io/en/stable/bundle_intro.html) format.\n", - "\n", - "Deploying AI models requires the integration with clinical imaging network, even if just in a for-research-use setting. This means that the AI deploy application will need to support standards-based imaging protocols, and specifically for Radiological imaging, DICOM protocol.\n", - "\n", - "Typically, DICOM network communication, either in DICOM TCP/IP network protocol or DICOMWeb, would be handled by DICOM devices or services, e.g. MONAI Deploy Informatics Gateway, so the deploy application itself would only need to use DICOM Part 10 files as input and save the AI result in DICOM Part10 file(s). For segmentation use cases, the DICOM instance file for AI results could be a DICOM Segmentation object or a DICOM RT Structure Set, and for classification, DICOM Structure Report and/or DICOM Encapsulated PDF.\n", - "\n", - "DICOM instances received from modalities and Picture Archiving and Communications System (PACS) are often times the whole DICOM study, so an AI deploy application has to deal with a whole DICOM study with multiple series, whose images' spacing may not be the same as expected by the trained model. To address these cases consistently and efficiently, MONAI Deploy Application SDK provides classes, called operators, to parse DICOM studies, select specific series with application-defined rules, and convert the selected DICOM series into domain-specific image format along with meta-data representing the pertinent DICOM attributes. The image is then further processed in the pre-processing stage to normalize spacing, orientation, intensity, etc., before pixel data as Tensors are used for inference.\n", - "\n", - "In the following sections, we will demonstrate how to create a MONAI Deploy application package using the MONAI Deploy App SDK, and importantly, using the built-in MONAI Bundle Inference Operator to perform inference with the Spleen CT Segmentation PyTorch model in a MONAI Bundle.\n", - "\n", - ":::{note}\n", - "For local testing, if there is a lack of DICOM Part 10 files, one can use open source programs, e.g. 3D Slicer, to convert a NIfTI file to a DICOM series.\n", - "\n", - "To make running this example simpler, the DICOM files and the [Spleen CT Segmentation MONAI Bundle](https://github.com/Project-MONAI/model-zoo/tree/dev/models/spleen_ct_segmentation), published in [MONAI Model Zoo](https://github.com/Project-MONAI/model-zoo), have been packaged and shared on Google Drive.\n", - "\n", - ":::\n", - "\n", - "## Creating Operators and connecting them in Application class\n", - "\n", - "We will implement an application that consists of five Operators:\n", - "\n", - "- **DICOMDataLoaderOperator**:\n", - " - **Input(dicom_files)**: a folder path (`Path`)\n", - " - **Output(dicom_study_list)**: a list of DICOM studies in memory (List[[`DICOMStudy`](/modules/_autosummary/monai.deploy.core.domain.DICOMStudy)])\n", - "- **DICOMSeriesSelectorOperator**:\n", - " - **Input(dicom_study_list)**: a list of DICOM studies in memory (List[[`DICOMStudy`](/modules/_autosummary/monai.deploy.core.domain.DICOMStudy)])\n", - " - **Input(selection_rules)**: a selection rule (Dict)\n", - " - **Output(study_selected_series_list)**: a DICOM series object in memory ([`StudySelectedSeries`](/modules/_autosummary/monai.deploy.core.domain.StudySelectedSeries))\n", - "- **DICOMSeriesToVolumeOperator**:\n", - " - **Input(study_selected_series_list)**: a DICOM series object in memory ([`StudySelectedSeries`](/modules/_autosummary/monai.deploy.core.domain.StudySelectedSeries))\n", - " - **Output(image)**: an image object in memory ([`Image`](/modules/_autosummary/monai.deploy.core.domain.Image))\n", - "- **MonaiBundleInferenceOperator**:\n", - " - **Input(image)**: an image object in memory ([`Image`](/modules/_autosummary/monai.deploy.core.domain.Image))\n", - " - **Output(pred)**: an image object in memory ([`Image`](/modules/_autosummary/monai.deploy.core.domain.Image))\n", - "- **DICOMSegmentationWriterOperator**:\n", - " - **Input(seg_image)**: a segmentation image object in memory ([`Image`](/modules/_autosummary/monai.deploy.core.domain.Image))\n", - " - **Input(study_selected_series_list)**: a DICOM series object in memory ([`StudySelectedSeries`](/modules/_autosummary/monai.deploy.core.domain.StudySelectedSeries))\n", - " - **Output(dicom_seg_instance)**: a file path (`Path`)\n", - "\n", - "\n", - ":::{note}\n", - "The `DICOMSegmentationWriterOperator` needs both the segmentation image as well as the original DICOM series meta-data in order to use the patient demographics and the DICOM Study level attributes.\n", - ":::\n", - "\n", - "The workflow of the application is illustrated below.\n", - "\n", - "```{mermaid}\n", - "%%{init: {\"theme\": \"base\", \"themeVariables\": { \"fontSize\": \"16px\"}} }%%\n", - "\n", - "classDiagram\n", - " direction TB\n", - "\n", - " DICOMDataLoaderOperator --|> DICOMSeriesSelectorOperator : dicom_study_list...dicom_study_list\n", - " DICOMSeriesSelectorOperator --|> DICOMSeriesToVolumeOperator : study_selected_series_list...study_selected_series_list\n", - " DICOMSeriesToVolumeOperator --|> MonaiBundleInferenceOperator : image...image\n", - " DICOMSeriesSelectorOperator --|> DICOMSegmentationWriterOperator : study_selected_series_list...study_selected_series_list\n", - " MonaiBundleInferenceOperator --|> DICOMSegmentationWriterOperator : pred...seg_image\n", - "\n", - "\n", - " class DICOMDataLoaderOperator {\n", - " dicom_files : DISK\n", - " dicom_study_list(out) IN_MEMORY\n", - " }\n", - " class DICOMSeriesSelectorOperator {\n", - " dicom_study_list : IN_MEMORY\n", - " selection_rules : IN_MEMORY\n", - " study_selected_series_list(out) IN_MEMORY\n", - " }\n", - " class DICOMSeriesToVolumeOperator {\n", - " study_selected_series_list : IN_MEMORY\n", - " image(out) IN_MEMORY\n", - " }\n", - " class MonaiBundleInferenceOperator {\n", - " image : IN_MEMORY\n", - " pred(out) IN_MEMORY\n", - " }\n", - " class DICOMSegmentationWriterOperator {\n", - " seg_image : IN_MEMORY\n", - " study_selected_series_list : IN_MEMORY\n", - " dicom_seg_instance(out) DISK\n", - " }\n", - "```\n", - "\n", - "### Setup environment\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Install MONAI and other necessary image processing packages for the application\n", - "!python -c \"import monai\" || pip install --upgrade -q \"monai<=1.5.0\"\n", - "!python -c \"import torch\" || pip install -q \"torch>=1.12.0\"\n", - "!python -c \"import numpy\" || pip install -q \"numpy>=1.21.6\"\n", - "!python -c \"import nibabel\" || pip install -q \"nibabel>=3.2.1\"\n", - "!python -c \"import pydicom\" || pip install -q \"pydicom>=2.3.0\"\n", - "!python -c \"import highdicom\" || pip install -q \"highdicom>=0.18.2\"\n", - "!python -c \"import SimpleITK\" || pip install -q \"SimpleITK>=2.0.0\"\n", - "!python -c \"import skimage\" || pip install -q \"scikit-image>=0.17.2\"\n", - "!python -c \"import stl\" || pip install -q \"numpy-stl>=2.12.0\"\n", - "!python -c \"import trimesh\" || pip install -q \"trimesh>=3.8.11\"\n", - "\n", - "# Install MONAI Deploy App SDK package\n", - "!python -c \"import holoscan\" || pip install --upgrade -q \"holoscan>=0.6.0\"\n", - "!python -c \"import monai.deploy\" || pip install -q \"monai-deploy-app-sdk\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note: you may need to restart the Jupyter kernel to use the updated packages." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Download/Extract input and model/bundle files from Google Drive\n", - "\n", - "**_Note:_** Data files are now access controlled. Please first request permission to access the [shared folder on Google Drive](https://drive.google.com/drive/folders/1EONJsrwbGsS30td0hs8zl4WKjihew1Z3?usp=sharing). Please download zip file, `mednist_classifieai_spleen_seg_bundle_data.zip` in the `ai_spleen_seg_app` folder, to the same folder as the notebook example." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ + "cells": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Archive: ai_spleen_seg_bundle_data.zip\n", - " inflating: dcm/1-001.dcm \n", - " inflating: dcm/1-002.dcm \n", - " inflating: dcm/1-003.dcm \n", - " inflating: dcm/1-004.dcm \n", - " inflating: dcm/1-005.dcm \n", - " inflating: dcm/1-006.dcm \n", - " inflating: dcm/1-007.dcm \n", - " inflating: dcm/1-008.dcm \n", - " inflating: dcm/1-009.dcm \n", - " inflating: dcm/1-010.dcm \n", - " inflating: dcm/1-011.dcm \n", - " inflating: dcm/1-012.dcm \n", - " inflating: dcm/1-013.dcm \n", - " inflating: dcm/1-014.dcm \n", - " inflating: dcm/1-015.dcm \n", - " inflating: dcm/1-016.dcm \n", - " inflating: dcm/1-017.dcm \n", - " inflating: dcm/1-018.dcm \n", - " inflating: dcm/1-019.dcm \n", - " inflating: dcm/1-020.dcm \n", - " inflating: dcm/1-021.dcm \n", - " inflating: dcm/1-022.dcm \n", - " inflating: dcm/1-023.dcm \n", - " inflating: dcm/1-024.dcm \n", - " inflating: dcm/1-025.dcm \n", - " inflating: dcm/1-026.dcm \n", - " inflating: dcm/1-027.dcm \n", - " inflating: dcm/1-028.dcm \n", - " inflating: dcm/1-029.dcm \n", - " inflating: dcm/1-030.dcm \n", - " inflating: dcm/1-031.dcm \n", - " inflating: dcm/1-032.dcm \n", - " inflating: dcm/1-033.dcm \n", - " inflating: dcm/1-034.dcm \n", - " inflating: dcm/1-035.dcm \n", - " inflating: dcm/1-036.dcm \n", - " inflating: dcm/1-037.dcm \n", - " inflating: dcm/1-038.dcm \n", - " inflating: dcm/1-039.dcm \n", - " inflating: dcm/1-040.dcm \n", - " inflating: dcm/1-041.dcm \n", - " inflating: dcm/1-042.dcm \n", - " inflating: dcm/1-043.dcm \n", - " inflating: dcm/1-044.dcm \n", - " inflating: dcm/1-045.dcm \n", - " inflating: dcm/1-046.dcm \n", - " inflating: dcm/1-047.dcm \n", - " inflating: dcm/1-048.dcm \n", - " inflating: dcm/1-049.dcm \n", - " inflating: dcm/1-050.dcm \n", - " inflating: dcm/1-051.dcm \n", - " inflating: dcm/1-052.dcm \n", - " inflating: dcm/1-053.dcm \n", - " inflating: dcm/1-054.dcm \n", - " inflating: dcm/1-055.dcm \n", - " inflating: dcm/1-056.dcm \n", - " inflating: dcm/1-057.dcm \n", - " inflating: dcm/1-058.dcm \n", - " inflating: dcm/1-059.dcm \n", - " inflating: dcm/1-060.dcm \n", - " inflating: dcm/1-061.dcm \n", - " inflating: dcm/1-062.dcm \n", - " inflating: dcm/1-063.dcm \n", - " inflating: dcm/1-064.dcm \n", - " inflating: dcm/1-065.dcm \n", - " inflating: dcm/1-066.dcm \n", - " inflating: dcm/1-067.dcm \n", - " inflating: dcm/1-068.dcm \n", - " inflating: dcm/1-069.dcm \n", - " inflating: dcm/1-070.dcm \n", - " inflating: dcm/1-071.dcm \n", - " inflating: dcm/1-072.dcm \n", - " inflating: dcm/1-073.dcm \n", - " inflating: dcm/1-074.dcm \n", - " inflating: dcm/1-075.dcm \n", - " inflating: dcm/1-076.dcm \n", - " inflating: dcm/1-077.dcm \n", - " inflating: dcm/1-078.dcm \n", - " inflating: dcm/1-079.dcm \n", - " inflating: dcm/1-080.dcm \n", - " inflating: dcm/1-081.dcm \n", - " inflating: dcm/1-082.dcm \n", - " inflating: dcm/1-083.dcm \n", - " inflating: dcm/1-084.dcm \n", - " inflating: dcm/1-085.dcm \n", - " inflating: dcm/1-086.dcm \n", - " inflating: dcm/1-087.dcm \n", - " inflating: dcm/1-088.dcm \n", - " inflating: dcm/1-089.dcm \n", - " inflating: dcm/1-090.dcm \n", - " inflating: dcm/1-091.dcm \n", - " inflating: dcm/1-092.dcm \n", - " inflating: dcm/1-093.dcm \n", - " inflating: dcm/1-094.dcm \n", - " inflating: dcm/1-095.dcm \n", - " inflating: dcm/1-096.dcm \n", - " inflating: dcm/1-097.dcm \n", - " inflating: dcm/1-098.dcm \n", - " inflating: dcm/1-099.dcm \n", - " inflating: dcm/1-100.dcm \n", - " inflating: dcm/1-101.dcm \n", - " inflating: dcm/1-102.dcm \n", - " inflating: dcm/1-103.dcm \n", - " inflating: dcm/1-104.dcm \n", - " inflating: dcm/1-105.dcm \n", - " inflating: dcm/1-106.dcm \n", - " inflating: dcm/1-107.dcm \n", - " inflating: dcm/1-108.dcm \n", - " inflating: dcm/1-109.dcm \n", - " inflating: dcm/1-110.dcm \n", - " inflating: dcm/1-111.dcm \n", - " inflating: dcm/1-112.dcm \n", - " inflating: dcm/1-113.dcm \n", - " inflating: dcm/1-114.dcm \n", - " inflating: dcm/1-115.dcm \n", - " inflating: dcm/1-116.dcm \n", - " inflating: dcm/1-117.dcm \n", - " inflating: dcm/1-118.dcm \n", - " inflating: dcm/1-119.dcm \n", - " inflating: dcm/1-120.dcm \n", - " inflating: dcm/1-121.dcm \n", - " inflating: dcm/1-122.dcm \n", - " inflating: dcm/1-123.dcm \n", - " inflating: dcm/1-124.dcm \n", - " inflating: dcm/1-125.dcm \n", - " inflating: dcm/1-126.dcm \n", - " inflating: dcm/1-127.dcm \n", - " inflating: dcm/1-128.dcm \n", - " inflating: dcm/1-129.dcm \n", - " inflating: dcm/1-130.dcm \n", - " inflating: dcm/1-131.dcm \n", - " inflating: dcm/1-132.dcm \n", - " inflating: dcm/1-133.dcm \n", - " inflating: dcm/1-134.dcm \n", - " inflating: dcm/1-135.dcm \n", - " inflating: dcm/1-136.dcm \n", - " inflating: dcm/1-137.dcm \n", - " inflating: dcm/1-138.dcm \n", - " inflating: dcm/1-139.dcm \n", - " inflating: dcm/1-140.dcm \n", - " inflating: dcm/1-141.dcm \n", - " inflating: dcm/1-142.dcm \n", - " inflating: dcm/1-143.dcm \n", - " inflating: dcm/1-144.dcm \n", - " inflating: dcm/1-145.dcm \n", - " inflating: dcm/1-146.dcm \n", - " inflating: dcm/1-147.dcm \n", - " inflating: dcm/1-148.dcm \n", - " inflating: dcm/1-149.dcm \n", - " inflating: dcm/1-150.dcm \n", - " inflating: dcm/1-151.dcm \n", - " inflating: dcm/1-152.dcm \n", - " inflating: dcm/1-153.dcm \n", - " inflating: dcm/1-154.dcm \n", - " inflating: dcm/1-155.dcm \n", - " inflating: dcm/1-156.dcm \n", - " inflating: dcm/1-157.dcm \n", - " inflating: dcm/1-158.dcm \n", - " inflating: dcm/1-159.dcm \n", - " inflating: dcm/1-160.dcm \n", - " inflating: dcm/1-161.dcm \n", - " inflating: dcm/1-162.dcm \n", - " inflating: dcm/1-163.dcm \n", - " inflating: dcm/1-164.dcm \n", - " inflating: dcm/1-165.dcm \n", - " inflating: dcm/1-166.dcm \n", - " inflating: dcm/1-167.dcm \n", - " inflating: dcm/1-168.dcm \n", - " inflating: dcm/1-169.dcm \n", - " inflating: dcm/1-170.dcm \n", - " inflating: dcm/1-171.dcm \n", - " inflating: dcm/1-172.dcm \n", - " inflating: dcm/1-173.dcm \n", - " inflating: dcm/1-174.dcm \n", - " inflating: dcm/1-175.dcm \n", - " inflating: dcm/1-176.dcm \n", - " inflating: dcm/1-177.dcm \n", - " inflating: dcm/1-178.dcm \n", - " inflating: dcm/1-179.dcm \n", - " inflating: dcm/1-180.dcm \n", - " inflating: dcm/1-181.dcm \n", - " inflating: dcm/1-182.dcm \n", - " inflating: dcm/1-183.dcm \n", - " inflating: dcm/1-184.dcm \n", - " inflating: dcm/1-185.dcm \n", - " inflating: dcm/1-186.dcm \n", - " inflating: dcm/1-187.dcm \n", - " inflating: dcm/1-188.dcm \n", - " inflating: dcm/1-189.dcm \n", - " inflating: dcm/1-190.dcm \n", - " inflating: dcm/1-191.dcm \n", - " inflating: dcm/1-192.dcm \n", - " inflating: dcm/1-193.dcm \n", - " inflating: dcm/1-194.dcm \n", - " inflating: dcm/1-195.dcm \n", - " inflating: dcm/1-196.dcm \n", - " inflating: dcm/1-197.dcm \n", - " inflating: dcm/1-198.dcm \n", - " inflating: dcm/1-199.dcm \n", - " inflating: dcm/1-200.dcm \n", - " inflating: dcm/1-201.dcm \n", - " inflating: dcm/1-202.dcm \n", - " inflating: dcm/1-203.dcm \n", - " inflating: dcm/1-204.dcm \n", - " inflating: model.ts \n", - "model.ts\n" - ] - } - ], - "source": [ - "# Download ai_spleen_bundle_data test data zip file. Please request access and download manually.\n", - "# !pip install gdown\n", - "# !gdown \"https://drive.google.com/uc?id=1IwWMpbo2fd38fKIqeIdL8SKTGvkn31tK\"\n", - "\n", - "# After downloading ai_spleen_bundle_data zip file from the web browser or using gdown,\n", - "!unzip -o \"ai_spleen_seg_bundle_data.zip\"\n", - "\n", - "# Need to copy the model.ts file to its own clean subfolder for packaging, to workaround an issue in the Packager\n", - "models_folder = \"models\"\n", - "!rm -rf {models_folder} && mkdir -p {models_folder}/model && cp model.ts {models_folder}/model && ls {models_folder}/model" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Set up environment variables" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Creating a Deploy App with MONAI Deploy App SDK and MONAI Bundle\n", + "\n", + "This tutorial shows how to create an application for organ segmentation using a PyTorch model that has been trained with MONAI and packaged in the [MONAI Bundle](https://monai.readthedocs.io/en/stable/bundle_intro.html) format.\n", + "\n", + "Deploying AI models requires the integration with clinical imaging network, even if just in a for-research-use setting. This means that the AI deploy application will need to support standards-based imaging protocols, and specifically for Radiological imaging, DICOM protocol.\n", + "\n", + "Typically, DICOM network communication, either in DICOM TCP/IP network protocol or DICOMWeb, would be handled by DICOM devices or services, e.g. MONAI Deploy Informatics Gateway, so the deploy application itself would only need to use DICOM Part 10 files as input and save the AI result in DICOM Part10 file(s). For segmentation use cases, the DICOM instance file for AI results could be a DICOM Segmentation object or a DICOM RT Structure Set, and for classification, DICOM Structure Report and/or DICOM Encapsulated PDF.\n", + "\n", + "DICOM instances received from modalities and Picture Archiving and Communications System (PACS) are often times the whole DICOM study, so an AI deploy application has to deal with a whole DICOM study with multiple series, whose images' spacing may not be the same as expected by the trained model. To address these cases consistently and efficiently, MONAI Deploy Application SDK provides classes, called operators, to parse DICOM studies, select specific series with application-defined rules, and convert the selected DICOM series into domain-specific image format along with meta-data representing the pertinent DICOM attributes. The image is then further processed in the pre-processing stage to normalize spacing, orientation, intensity, etc., before pixel data as Tensors are used for inference.\n", + "\n", + "In the following sections, we will demonstrate how to create a MONAI Deploy application package using the MONAI Deploy App SDK, and importantly, using the built-in MONAI Bundle Inference Operator to perform inference with the Spleen CT Segmentation PyTorch model in a MONAI Bundle.\n", + "\n", + ":::{note}\n", + "For local testing, if there is a lack of DICOM Part 10 files, one can use open source programs, e.g. 3D Slicer, to convert a NIfTI file to a DICOM series.\n", + "\n", + "To make running this example simpler, the DICOM files and the [Spleen CT Segmentation MONAI Bundle](https://github.com/Project-MONAI/model-zoo/tree/dev/models/spleen_ct_segmentation), published in [MONAI Model Zoo](https://github.com/Project-MONAI/model-zoo), have been packaged and shared on Google Drive.\n", + "\n", + ":::\n", + "\n", + "## Creating Operators and connecting them in Application class\n", + "\n", + "We will implement an application that consists of five Operators:\n", + "\n", + "- **DICOMDataLoaderOperator**:\n", + " - **Input(dicom_files)**: a folder path (`Path`)\n", + " - **Output(dicom_study_list)**: a list of DICOM studies in memory (List[[`DICOMStudy`](/modules/_autosummary/monai.deploy.core.domain.DICOMStudy)])\n", + "- **DICOMSeriesSelectorOperator**:\n", + " - **Input(dicom_study_list)**: a list of DICOM studies in memory (List[[`DICOMStudy`](/modules/_autosummary/monai.deploy.core.domain.DICOMStudy)])\n", + " - **Input(selection_rules)**: a selection rule (Dict)\n", + " - **Output(study_selected_series_list)**: a DICOM series object in memory ([`StudySelectedSeries`](/modules/_autosummary/monai.deploy.core.domain.StudySelectedSeries))\n", + "- **DICOMSeriesToVolumeOperator**:\n", + " - **Input(study_selected_series_list)**: a DICOM series object in memory ([`StudySelectedSeries`](/modules/_autosummary/monai.deploy.core.domain.StudySelectedSeries))\n", + " - **Output(image)**: an image object in memory ([`Image`](/modules/_autosummary/monai.deploy.core.domain.Image))\n", + "- **MonaiBundleInferenceOperator**:\n", + " - **Input(image)**: an image object in memory ([`Image`](/modules/_autosummary/monai.deploy.core.domain.Image))\n", + " - **Output(pred)**: an image object in memory ([`Image`](/modules/_autosummary/monai.deploy.core.domain.Image))\n", + "- **DICOMSegmentationWriterOperator**:\n", + " - **Input(seg_image)**: a segmentation image object in memory ([`Image`](/modules/_autosummary/monai.deploy.core.domain.Image))\n", + " - **Input(study_selected_series_list)**: a DICOM series object in memory ([`StudySelectedSeries`](/modules/_autosummary/monai.deploy.core.domain.StudySelectedSeries))\n", + " - **Output(dicom_seg_instance)**: a file path (`Path`)\n", + "\n", + "\n", + ":::{note}\n", + "The `DICOMSegmentationWriterOperator` needs both the segmentation image as well as the original DICOM series meta-data in order to use the patient demographics and the DICOM Study level attributes.\n", + ":::\n", + "\n", + "The workflow of the application is illustrated below.\n", + "\n", + "```{mermaid}\n", + "%%{init: {\"theme\": \"base\", \"themeVariables\": { \"fontSize\": \"16px\"}} }%%\n", + "\n", + "classDiagram\n", + " direction TB\n", + "\n", + " DICOMDataLoaderOperator --|> DICOMSeriesSelectorOperator : dicom_study_list...dicom_study_list\n", + " DICOMSeriesSelectorOperator --|> DICOMSeriesToVolumeOperator : study_selected_series_list...study_selected_series_list\n", + " DICOMSeriesToVolumeOperator --|> MonaiBundleInferenceOperator : image...image\n", + " DICOMSeriesSelectorOperator --|> DICOMSegmentationWriterOperator : study_selected_series_list...study_selected_series_list\n", + " MonaiBundleInferenceOperator --|> DICOMSegmentationWriterOperator : pred...seg_image\n", + "\n", + "\n", + " class DICOMDataLoaderOperator {\n", + " dicom_files : DISK\n", + " dicom_study_list(out) IN_MEMORY\n", + " }\n", + " class DICOMSeriesSelectorOperator {\n", + " dicom_study_list : IN_MEMORY\n", + " selection_rules : IN_MEMORY\n", + " study_selected_series_list(out) IN_MEMORY\n", + " }\n", + " class DICOMSeriesToVolumeOperator {\n", + " study_selected_series_list : IN_MEMORY\n", + " image(out) IN_MEMORY\n", + " }\n", + " class MonaiBundleInferenceOperator {\n", + " image : IN_MEMORY\n", + " pred(out) IN_MEMORY\n", + " }\n", + " class DICOMSegmentationWriterOperator {\n", + " seg_image : IN_MEMORY\n", + " study_selected_series_list : IN_MEMORY\n", + " dicom_seg_instance(out) DISK\n", + " }\n", + "```\n", + "\n", + "### Setup environment\n" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "env: HOLOSCAN_INPUT_PATH=dcm\n", - "env: HOLOSCAN_MODEL_PATH=models\n", - "env: HOLOSCAN_OUTPUT_PATH=output\n" - ] - } - ], - "source": [ - "%env HOLOSCAN_INPUT_PATH dcm\n", - "%env HOLOSCAN_MODEL_PATH {models_folder}\n", - "%env HOLOSCAN_OUTPUT_PATH output" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Set up imports\n", - "\n", - "Let's import necessary classes/decorators to define Application and Operator." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "import logging\n", - "from pathlib import Path\n", - "\n", - "# Required for setting SegmentDescription attributes. Direct import as this is not part of App SDK package.\n", - "from pydicom.sr.codedict import codes\n", - "\n", - "from monai.deploy.conditions import CountCondition\n", - "from monai.deploy.core import AppContext, Application\n", - "from monai.deploy.core.domain import Image\n", - "from monai.deploy.core.io_type import IOType\n", - "from monai.deploy.operators.dicom_data_loader_operator import DICOMDataLoaderOperator\n", - "from monai.deploy.operators.dicom_seg_writer_operator import DICOMSegmentationWriterOperator, SegmentDescription\n", - "from monai.deploy.operators.dicom_series_selector_operator import DICOMSeriesSelectorOperator\n", - "from monai.deploy.operators.dicom_series_to_volume_operator import DICOMSeriesToVolumeOperator\n", - "from monai.deploy.operators.monai_bundle_inference_operator import (\n", - " BundleConfigNames,\n", - " IOMapping,\n", - " MonaiBundleInferenceOperator,\n", - ")\n", - "from monai.deploy.operators.stl_conversion_operator import STLConversionOperator\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Determining the Input and Output for the Model Bundle Inference Operator\n", - "\n", - "The App SDK provides a `MonaiBundleInferenceOperator` class to perform inference with a MONAI Bundle, which is essentially a PyTorch model in TorchScript with additional metadata describing the model network and processing specification. This operator uses the MONAI utilities to parse a MONAI Bundle to automatically instantiate the objects required for input and output processing as well as inference, as such it depends on MONAI transforms, inferers, and in turn their dependencies.\n", - "\n", - "Each Operator class inherits from the base `Operator` base class, and its input/output properties are specified in the `setup` function (as opposed to using decorators `@input`and `@output` in Version 0.5 and below).\n", - "\n", - "For the `MonaiBundleInferenceOperator` class, the input/output need to be defined to match those of the model network, both in name and data type. For the current release, an `IOMapping` object is used to connect the operator input/output to those of the model network by using the same names. This is likely to change, to be automated, in the future releases once certain limitation in the App SDK is removed.\n", - "\n", - "The Spleen CT Segmentation model network has a named input, called \"image\", and the named output called \"pred\", and both are of image type, which can all be mapped to the App SDK [Image](/modules/_autosummary/monai.deploy.core.domain.Image). This piece of information is typically acquired by examining the model metadata `network_data_format` attribute in the bundle, as seen in this [example] (https://github.com/Project-MONAI/model-zoo/blob/dev/models/spleen_ct_segmentation/configs/metadata.json)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating Application class\n", - "\n", - "Our application class would look like below.\n", - "\n", - "It defines `App` class, inheriting the base `Application` class.\n", - "\n", - "Objects required for DICOM parsing, series selection, pixel data conversion to volume image, model specific inference, and the AI result specific DICOM Segmentation object writers are created. The execution pipeline, as a Directed Acyclic Graph, is then constructed by connecting these objects through `self.add_flow()`." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "class AISpleenSegApp(Application):\n", - " \"\"\"Demonstrates inference with built-in MONAI Bundle inference operator with DICOM files as input/output\n", - "\n", - " This application loads a set of DICOM instances, select the appropriate series, converts the series to\n", - " 3D volume image, performs inference with the built-in MONAI Bundle inference operator, including pre-processing\n", - " and post-processing, save the segmentation image in a DICOM Seg OID in an instance file, and optionally the\n", - " surface mesh in STL format.\n", - "\n", - " Pertinent MONAI Bundle:\n", - " https://github.com/Project-MONAI/model-zoo/tree/dev/models/spleen_ct_segmentation\n", - "\n", - " Execution Time Estimate:\n", - " With a Nvidia GV100 32GB GPU, for an input DICOM Series of 515 instances, the execution time is around\n", - " 25 seconds with saving both DICOM Seg and surface mesh STL file, and 15 seconds with DICOM Seg only.\n", - " \"\"\"\n", - "\n", - " def __init__(self, *args, **kwargs):\n", - " \"\"\"Creates an application instance.\"\"\"\n", - " self._logger = logging.getLogger(\"{}.{}\".format(__name__, type(self).__name__))\n", - " super().__init__(*args, **kwargs)\n", - "\n", - " def run(self, *args, **kwargs):\n", - " # This method calls the base class to run. Can be omitted if simply calling through.\n", - " self._logger.info(f\"Begin {self.run.__name__}\")\n", - " super().run(*args, **kwargs)\n", - " self._logger.info(f\"End {self.run.__name__}\")\n", - "\n", - " def compose(self):\n", - " \"\"\"Creates the app specific operators and chain them up in the processing DAG.\"\"\"\n", - "\n", - " logging.info(f\"Begin {self.compose.__name__}\")\n", - "\n", - " app_context = Application.init_app_context({}) # Do not pass argv in Jupyter Notebook\n", - " app_input_path = Path(app_context.input_path)\n", - " app_output_path = Path(app_context.output_path)\n", - " model_path = Path(app_context.model_path)\n", - "\n", - " # Create the custom operator(s) as well as SDK built-in operator(s).\n", - " study_loader_op = DICOMDataLoaderOperator(\n", - " self, CountCondition(self, 1), input_folder=app_input_path, name=\"study_loader_op\"\n", - " )\n", - " series_selector_op = DICOMSeriesSelectorOperator(self, rules=Sample_Rules_Text, name=\"series_selector_op\")\n", - " series_to_vol_op = DICOMSeriesToVolumeOperator(self, name=\"series_to_vol_op\")\n", - "\n", - " # Create the inference operator that supports MONAI Bundle and automates the inference.\n", - " # The IOMapping labels match the input and prediction keys in the pre and post processing.\n", - " # The model_name is optional when the app has only one model.\n", - " # The bundle_path argument optionally can be set to an accessible bundle file path in the dev\n", - " # environment, so when the app is packaged into a MAP, the operator can complete the bundle parsing\n", - " # during init.\n", - "\n", - " config_names = BundleConfigNames(config_names=[\"inference\"]) # Same as the default\n", - "\n", - " bundle_spleen_seg_op = MonaiBundleInferenceOperator(\n", - " self,\n", - " input_mapping=[IOMapping(\"image\", Image, IOType.IN_MEMORY)],\n", - " output_mapping=[IOMapping(\"pred\", Image, IOType.IN_MEMORY)],\n", - " app_context=app_context,\n", - " bundle_config_names=config_names,\n", - " bundle_path=model_path,\n", - " name=\"bundle_spleen_seg_op\",\n", - " )\n", - "\n", - " # Create DICOM Seg writer providing the required segment description for each segment with\n", - " # the actual algorithm and the pertinent organ/tissue. The segment_label, algorithm_name,\n", - " # and algorithm_version are of DICOM VR LO type, limited to 64 chars.\n", - " # https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_6.2.html\n", - " segment_descriptions = [\n", - " SegmentDescription(\n", - " segment_label=\"Spleen\",\n", - " segmented_property_category=codes.SCT.Organ,\n", - " segmented_property_type=codes.SCT.Spleen,\n", - " algorithm_name=\"volumetric (3D) segmentation of the spleen from CT image\",\n", - " algorithm_family=codes.DCM.ArtificialIntelligence,\n", - " algorithm_version=\"0.3.2\",\n", - " )\n", - " ]\n", - "\n", - " custom_tags = {\"SeriesDescription\": \"AI generated Seg, not for clinical use.\"}\n", - "\n", - " dicom_seg_writer = DICOMSegmentationWriterOperator(\n", - " self,\n", - " segment_descriptions=segment_descriptions,\n", - " custom_tags=custom_tags,\n", - " output_folder=app_output_path,\n", - " name=\"dicom_seg_writer\",\n", - " )\n", - "\n", - " # Create the processing pipeline, by specifying the source and destination operators, and\n", - " # ensuring the output from the former matches the input of the latter, in both name and type.\n", - " self.add_flow(study_loader_op, series_selector_op, {(\"dicom_study_list\", \"dicom_study_list\")})\n", - " self.add_flow(\n", - " series_selector_op, series_to_vol_op, {(\"study_selected_series_list\", \"study_selected_series_list\")}\n", - " )\n", - " self.add_flow(series_to_vol_op, bundle_spleen_seg_op, {(\"image\", \"image\")})\n", - " # Note below the dicom_seg_writer requires two inputs, each coming from a source operator.\n", - " self.add_flow(\n", - " series_selector_op, dicom_seg_writer, {(\"study_selected_series_list\", \"study_selected_series_list\")}\n", - " )\n", - " self.add_flow(bundle_spleen_seg_op, dicom_seg_writer, {(\"pred\", \"seg_image\")})\n", - " # Create the surface mesh STL conversion operator and add it to the app execution flow, if needed, by\n", - " # uncommenting the following couple lines.\n", - " stl_conversion_op = STLConversionOperator(\n", - " self, output_file=app_output_path.joinpath(\"stl/spleen.stl\"), name=\"stl_conversion_op\"\n", - " )\n", - " self.add_flow(bundle_spleen_seg_op, stl_conversion_op, {(\"pred\", \"image\")})\n", - "\n", - " logging.info(f\"End {self.compose.__name__}\")\n", - "\n", - "\n", - "# This is a sample series selection rule in JSON, simply selecting CT series.\n", - "# If the study has more than 1 CT series, then all of them will be selected.\n", - "# Please see more detail in DICOMSeriesSelectorOperator.\n", - "Sample_Rules_Text = \"\"\"\n", - "{\n", - " \"selections\": [\n", - " {\n", - " \"name\": \"CT Series\",\n", - " \"conditions\": {\n", - " \"StudyDescription\": \"(.*?)\",\n", - " \"Modality\": \"(?i)CT\",\n", - " \"SeriesDescription\": \"(.*?)\"\n", - " }\n", - " }\n", - " ]\n", - "}\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Executing app locally\n", - "\n", - "We can execute the app in the Jupyter notebook. Note that the DICOM files of the CT Abdomen series must be present in the `dcm` folder and the Torch Script model, `model.ts`, also in the folder as pointed to by the environment variables." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Install MONAI and other necessary image processing packages for the application\n", + "!python -c \"import monai\" || pip install --upgrade -q \"monai<=1.5.0\"\n", + "!python -c \"import torch\" || pip install -q \"torch>=1.12.0\"\n", + "!python -c \"import numpy\" || pip install -q \"numpy>=1.21.6\"\n", + "!python -c \"import nibabel\" || pip install -q \"nibabel>=3.2.1\"\n", + "!python -c \"import pydicom\" || pip install -q \"pydicom>=2.3.0\"\n", + "!python -c \"import highdicom\" || pip install -q \"highdicom>=0.18.2\"\n", + "!python -c \"import SimpleITK\" || pip install -q \"SimpleITK>=2.0.0\"\n", + "!python -c \"import skimage\" || pip install -q \"scikit-image>=0.17.2\"\n", + "!python -c \"import stl\" || pip install -q \"numpy-stl>=2.12.0\"\n", + "!python -c \"import trimesh\" || pip install -q \"trimesh>=3.8.11\"\n", + "\n", + "# Install MONAI Deploy App SDK package\n", + "!python -c \"import holoscan\" || pip install --upgrade -q \"holoscan>=0.6.0\"\n", + "!python -c \"import monai.deploy\" || pip install -q \"monai-deploy-app-sdk\"" + ] + }, { - "name": "stderr", - "output_type": "stream", - "text": [ - "[info] [fragment.cpp:705] Loading extensions from configs...\n", - "[2025-04-22 10:18:02,158] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=[])\n", - "[2025-04-22 10:18:02,166] [INFO] (root) - AppContext object: AppContext(input_path=dcm, output_path=output, model_path=models, workdir=), triton_server_netloc=\n", - "[2025-04-22 10:18:02,176] [INFO] (root) - End compose\n", - "[info] [gxf_executor.cpp:265] Creating context\n", - "[info] [gxf_executor.cpp:2396] Activating Graph...\n", - "[info] [gxf_executor.cpp:2426] Running Graph...\n", - "[info] [gxf_executor.cpp:2428] Waiting for completion...\n", - "[info] [greedy_scheduler.cpp:191] Scheduling 6 entities\n", - "[2025-04-22 10:18:02,203] [INFO] (monai.deploy.operators.dicom_data_loader_operator.DICOMDataLoaderOperator) - No or invalid input path from the optional input port: None\n", - "[2025-04-22 10:18:02,743] [INFO] (root) - Finding series for Selection named: CT Series\n", - "[2025-04-22 10:18:02,744] [INFO] (root) - Searching study, : 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291\n", - " # of series: 1\n", - "[2025-04-22 10:18:02,745] [INFO] (root) - Working on series, instance UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2025-04-22 10:18:02,746] [INFO] (root) - On attribute: 'StudyDescription' to match value: '(.*?)'\n", - "[2025-04-22 10:18:02,746] [INFO] (root) - Series attribute StudyDescription value: CT ABDOMEN W IV CONTRAST\n", - "[2025-04-22 10:18:02,747] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "[2025-04-22 10:18:02,748] [INFO] (root) - On attribute: 'Modality' to match value: '(?i)CT'\n", - "[2025-04-22 10:18:02,748] [INFO] (root) - Series attribute Modality value: CT\n", - "[2025-04-22 10:18:02,749] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "[2025-04-22 10:18:02,750] [INFO] (root) - On attribute: 'SeriesDescription' to match value: '(.*?)'\n", - "[2025-04-22 10:18:02,751] [INFO] (root) - Series attribute SeriesDescription value: ABD/PANC 3.0 B31f\n", - "[2025-04-22 10:18:02,752] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "[2025-04-22 10:18:02,753] [INFO] (root) - Selected Series, UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2025-04-22 10:18:02,753] [INFO] (root) - Series Selection finalized.\n", - "[2025-04-22 10:18:02,754] [INFO] (root) - Series Description of selected DICOM Series for inference: ABD/PANC 3.0 B31f\n", - "[2025-04-22 10:18:02,755] [INFO] (root) - Series Instance UID of selected DICOM Series for inference: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2025-04-22 10:18:02,968] [INFO] (root) - Casting to float32\n", - "[2025-04-22 10:18:03,025] [INFO] (root) - Parsing from bundle_path: /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/models/model/model.ts\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/monai/bundle/reference_resolver.py:216: UserWarning: Detected deprecated name 'optional_packages_version' in configuration file, replacing with 'required_packages_version'.\n", - " warnings.warn(\n", - "[2025-04-22 10:18:06,025] [INFO] (monai.deploy.operators.stl_conversion_operator.STLConversionOperator) - Output will be saved in file output/stl/spleen.stl.\n", - "[2025-04-22 10:18:07,405] [INFO] (monai.deploy.operators.stl_conversion_operator.SpatialImage) - 3D image\n", - "[2025-04-22 10:18:07,406] [INFO] (monai.deploy.operators.stl_conversion_operator.STLConverter) - Image ndarray shape:(204, 512, 512)\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/highdicom/base.py:163: UserWarning: The string \"C3N-00198\" is unlikely to represent the intended person name since it contains only a single component. Construct a person name according to the format in described in https://dicom.nema.org/dicom/2013/output/chtml/part05/sect_6.2.html#sect_6.2.1.2, or, in pydicom 2.2.0 or later, use the pydicom.valuerep.PersonName.from_named_components() method to construct the person name correctly. If a single-component name is really intended, add a trailing caret character to disambiguate the name.\n", - " check_person_name(patient_name)\n", - "[2025-04-22 10:18:17,835] [INFO] (highdicom.base) - copy Image-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 10:18:17,836] [INFO] (highdicom.base) - copy attributes of module \"Specimen\"\n", - "[2025-04-22 10:18:17,837] [INFO] (highdicom.base) - copy Patient-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 10:18:17,838] [INFO] (highdicom.base) - copy attributes of module \"Patient\"\n", - "[2025-04-22 10:18:17,839] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Subject\"\n", - "[2025-04-22 10:18:17,839] [INFO] (highdicom.base) - copy Study-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 10:18:17,840] [INFO] (highdicom.base) - copy attributes of module \"General Study\"\n", - "[2025-04-22 10:18:17,841] [INFO] (highdicom.base) - copy attributes of module \"Patient Study\"\n", - "[2025-04-22 10:18:17,842] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Study\"\n", - "[info] [greedy_scheduler.cpp:372] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "[info] [greedy_scheduler.cpp:401] Scheduler finished.\n", - "[info] [gxf_executor.cpp:2431] Deactivating Graph...\n", - "[info] [gxf_executor.cpp:2439] Graph execution finished.\n", - "[2025-04-22 10:18:17,958] [INFO] (__main__.AISpleenSegApp) - End run\n", - "[2025-04-22 10:18:17,960] [INFO] (root) - End __main__\n" - ] - } - ], - "source": [ - "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", - "logging.info(f\"Begin {__name__}\")\n", - "AISpleenSegApp().run()\n", - "logging.info(f\"End {__name__}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Once the application is verified inside Jupyter notebook, we can write the above Python code into Python files in an application folder.\n", - "\n", - "The application folder structure would look like below:\n", - "\n", - "```bash\n", - "my_app\n", - "├── __main__.py\n", - "└── app.py\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Create an application folder\n", - "!mkdir -p my_app && rm -rf my_app/*" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### app.py" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note: you may need to restart the Jupyter kernel to use the updated packages." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing my_app/app.py\n" - ] - } - ], - "source": [ - "%%writefile my_app/app.py\n", - "\n", - "# Copyright 2021-2023 MONAI Consortium\n", - "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "# you may not use this file except in compliance with the License.\n", - "# You may obtain a copy of the License at\n", - "# http://www.apache.org/licenses/LICENSE-2.0\n", - "# Unless required by applicable law or agreed to in writing, software\n", - "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", - "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", - "# See the License for the specific language governing permissions and\n", - "# limitations under the License.\n", - "\n", - "import logging\n", - "from pathlib import Path\n", - "\n", - "# Required for setting SegmentDescription attributes. Direct import as this is not part of App SDK package.\n", - "from pydicom.sr.codedict import codes\n", - "\n", - "from monai.deploy.conditions import CountCondition\n", - "from monai.deploy.core import AppContext, Application\n", - "from monai.deploy.core.domain import Image\n", - "from monai.deploy.core.io_type import IOType\n", - "from monai.deploy.operators.dicom_data_loader_operator import DICOMDataLoaderOperator\n", - "from monai.deploy.operators.dicom_seg_writer_operator import DICOMSegmentationWriterOperator, SegmentDescription\n", - "from monai.deploy.operators.dicom_series_selector_operator import DICOMSeriesSelectorOperator\n", - "from monai.deploy.operators.dicom_series_to_volume_operator import DICOMSeriesToVolumeOperator\n", - "from monai.deploy.operators.monai_bundle_inference_operator import (\n", - " BundleConfigNames,\n", - " IOMapping,\n", - " MonaiBundleInferenceOperator,\n", - ")\n", - "from monai.deploy.operators.stl_conversion_operator import STLConversionOperator\n", - "\n", - "\n", - "class AISpleenSegApp(Application):\n", - " \"\"\"Demonstrates inference with built-in MONAI Bundle inference operator with DICOM files as input/output\n", - "\n", - " This application loads a set of DICOM instances, select the appropriate series, converts the series to\n", - " 3D volume image, performs inference with the built-in MONAI Bundle inference operator, including pre-processing\n", - " and post-processing, save the segmentation image in a DICOM Seg OID in an instance file, and optionally the\n", - " surface mesh in STL format.\n", - "\n", - " Pertinent MONAI Bundle:\n", - " https://github.com/Project-MONAI/model-zoo/tree/dev/models/spleen_ct_segmentation\n", - "\n", - " Execution Time Estimate:\n", - " With a Nvidia GV100 32GB GPU, for an input DICOM Series of 515 instances, the execution time is around\n", - " 25 seconds with saving both DICOM Seg and surface mesh STL file, and 15 seconds with DICOM Seg only.\n", - " \"\"\"\n", - "\n", - " def __init__(self, *args, **kwargs):\n", - " \"\"\"Creates an application instance.\"\"\"\n", - " self._logger = logging.getLogger(\"{}.{}\".format(__name__, type(self).__name__))\n", - " super().__init__(*args, **kwargs)\n", - "\n", - " def run(self, *args, **kwargs):\n", - " # This method calls the base class to run. Can be omitted if simply calling through.\n", - " self._logger.info(f\"Begin {self.run.__name__}\")\n", - " super().run(*args, **kwargs)\n", - " self._logger.info(f\"End {self.run.__name__}\")\n", - "\n", - " def compose(self):\n", - " \"\"\"Creates the app specific operators and chain them up in the processing DAG.\"\"\"\n", - "\n", - " logging.info(f\"Begin {self.compose.__name__}\")\n", - "\n", - " # Use Commandline options over environment variables to init context.\n", - " app_context = Application.init_app_context(self.argv)\n", - " app_input_path = Path(app_context.input_path)\n", - " app_output_path = Path(app_context.output_path)\n", - " model_path = Path(app_context.model_path)\n", - "\n", - " # Create the custom operator(s) as well as SDK built-in operator(s).\n", - " study_loader_op = DICOMDataLoaderOperator(\n", - " self, CountCondition(self, 1), input_folder=app_input_path, name=\"study_loader_op\"\n", - " )\n", - " series_selector_op = DICOMSeriesSelectorOperator(self, rules=Sample_Rules_Text, name=\"series_selector_op\")\n", - " series_to_vol_op = DICOMSeriesToVolumeOperator(self, name=\"series_to_vol_op\")\n", - "\n", - " # Create the inference operator that supports MONAI Bundle and automates the inference.\n", - " # The IOMapping labels match the input and prediction keys in the pre and post processing.\n", - " # The model_name is optional when the app has only one model.\n", - " # The bundle_path argument optionally can be set to an accessible bundle file path in the dev\n", - " # environment, so when the app is packaged into a MAP, the operator can complete the bundle parsing\n", - " # during init.\n", - "\n", - " config_names = BundleConfigNames(config_names=[\"inference\"]) # Same as the default\n", - "\n", - " bundle_spleen_seg_op = MonaiBundleInferenceOperator(\n", - " self,\n", - " input_mapping=[IOMapping(\"image\", Image, IOType.IN_MEMORY)],\n", - " output_mapping=[IOMapping(\"pred\", Image, IOType.IN_MEMORY)],\n", - " app_context=app_context,\n", - " bundle_config_names=config_names,\n", - " bundle_path=model_path,\n", - " name=\"bundle_spleen_seg_op\",\n", - " )\n", - "\n", - " # Create DICOM Seg writer providing the required segment description for each segment with\n", - " # the actual algorithm and the pertinent organ/tissue. The segment_label, algorithm_name,\n", - " # and algorithm_version are of DICOM VR LO type, limited to 64 chars.\n", - " # https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_6.2.html\n", - " segment_descriptions = [\n", - " SegmentDescription(\n", - " segment_label=\"Spleen\",\n", - " segmented_property_category=codes.SCT.Organ,\n", - " segmented_property_type=codes.SCT.Spleen,\n", - " algorithm_name=\"volumetric (3D) segmentation of the spleen from CT image\",\n", - " algorithm_family=codes.DCM.ArtificialIntelligence,\n", - " algorithm_version=\"0.3.2\",\n", - " )\n", - " ]\n", - "\n", - " custom_tags = {\"SeriesDescription\": \"AI generated Seg, not for clinical use.\"}\n", - "\n", - " dicom_seg_writer = DICOMSegmentationWriterOperator(\n", - " self,\n", - " segment_descriptions=segment_descriptions,\n", - " custom_tags=custom_tags,\n", - " output_folder=app_output_path,\n", - " name=\"dicom_seg_writer\",\n", - " )\n", - "\n", - " # Create the processing pipeline, by specifying the source and destination operators, and\n", - " # ensuring the output from the former matches the input of the latter, in both name and type.\n", - " self.add_flow(study_loader_op, series_selector_op, {(\"dicom_study_list\", \"dicom_study_list\")})\n", - " self.add_flow(\n", - " series_selector_op, series_to_vol_op, {(\"study_selected_series_list\", \"study_selected_series_list\")}\n", - " )\n", - " self.add_flow(series_to_vol_op, bundle_spleen_seg_op, {(\"image\", \"image\")})\n", - " # Note below the dicom_seg_writer requires two inputs, each coming from a source operator.\n", - " self.add_flow(\n", - " series_selector_op, dicom_seg_writer, {(\"study_selected_series_list\", \"study_selected_series_list\")}\n", - " )\n", - " self.add_flow(bundle_spleen_seg_op, dicom_seg_writer, {(\"pred\", \"seg_image\")})\n", - " # Create the surface mesh STL conversion operator and add it to the app execution flow, if needed, by\n", - " # uncommenting the following couple lines.\n", - " stl_conversion_op = STLConversionOperator(\n", - " self, output_file=app_output_path.joinpath(\"stl/spleen.stl\"), name=\"stl_conversion_op\"\n", - " )\n", - " self.add_flow(bundle_spleen_seg_op, stl_conversion_op, {(\"pred\", \"image\")})\n", - "\n", - " logging.info(f\"End {self.compose.__name__}\")\n", - "\n", - "\n", - "# This is a sample series selection rule in JSON, simply selecting CT series.\n", - "# If the study has more than 1 CT series, then all of them will be selected.\n", - "# Please see more detail in DICOMSeriesSelectorOperator.\n", - "Sample_Rules_Text = \"\"\"\n", - "{\n", - " \"selections\": [\n", - " {\n", - " \"name\": \"CT Series\",\n", - " \"conditions\": {\n", - " \"StudyDescription\": \"(.*?)\",\n", - " \"Modality\": \"(?i)CT\",\n", - " \"SeriesDescription\": \"(.*?)\"\n", - " }\n", - " }\n", - " ]\n", - "}\n", - "\"\"\"\n", - "\n", - "if __name__ == \"__main__\":\n", - " AISpleenSegApp().run()\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```python\n", - "if __name__ == \"__main__\":\n", - " AISpleenSegApp().run()\n", - "```\n", - "\n", - "The above lines are needed to execute the application code by using `python` interpreter.\n", - "\n", - "### \\_\\_main\\_\\_.py\n", - "\n", - "\\_\\_main\\_\\_.py is needed for MONAI Application Packager to detect the main application code (`app.py`) when the application is executed with the application folder path (e.g., `python simple_imaging_app`)." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Download/Extract input and model/bundle files from Google Drive\n", + "\n", + "**_Note:_** Data files are now access controlled. Please first request permission to access the [shared folder on Google Drive](https://drive.google.com/drive/folders/1EONJsrwbGsS30td0hs8zl4WKjihew1Z3?usp=sharing). Please download zip file, `mednist_classifieai_spleen_seg_bundle_data.zip` in the `ai_spleen_seg_app` folder, to the same folder as the notebook example." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing my_app/__main__.py\n" - ] - } - ], - "source": [ - "%%writefile my_app/__main__.py\n", - "from app import AISpleenSegApp\n", - "\n", - "if __name__ == \"__main__\":\n", - " AISpleenSegApp().run()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Download ai_spleen_bundle_data test data zip file. Please request access and download manually.\n", + "# !pip install gdown\n", + "# !gdown \"https://drive.google.com/uc?id=1IwWMpbo2fd38fKIqeIdL8SKTGvkn31tK\"\n", + "\n", + "# After downloading ai_spleen_bundle_data zip file from the web browser or using gdown,\n", + "!unzip -o \"ai_spleen_seg_bundle_data.zip\"\n", + "\n", + "# Need to copy the model.ts file to its own clean subfolder for packaging, to workaround an issue in the Packager\n", + "models_folder = \"models\"\n", + "!rm -rf {models_folder} && mkdir -p {models_folder}/model && cp model.ts {models_folder}/model && ls {models_folder}/model" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "app.py\t__main__.py\n" - ] - } - ], - "source": [ - "!ls my_app" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This time, let's execute the app in the command line.\n", - "\n", - ":::{note}\n", - "Since the environment variables have been set and contain the correct paths, it is not necessary to provide the command line options on running the application. The following command demonstrates the use of the options.\n", - ":::" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set up environment variables" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "[\u001b[32minfo\u001b[m] [fragment.cpp:705] Loading extensions from configs...\n", - "[2025-04-22 10:18:22,991] [INFO] (root) - Parsed args: Namespace(log_level=None, input=PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/dcm'), output=PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/output'), model=PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/models'), workdir=None, triton_server_netloc=None, argv=['my_app', '-i', 'dcm', '-o', 'output', '-m', 'models'])\n", - "[2025-04-22 10:18:22,993] [INFO] (root) - AppContext object: AppContext(input_path=/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/dcm, output_path=/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/output, model_path=/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/models, workdir=), triton_server_netloc=\n", - "[2025-04-22 10:18:22,994] [INFO] (root) - End compose\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:265] Creating context\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2396] Activating Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2426] Running Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2428] Waiting for completion...\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:191] Scheduling 6 entities\n", - "[2025-04-22 10:18:23,011] [INFO] (monai.deploy.operators.dicom_data_loader_operator.DICOMDataLoaderOperator) - No or invalid input path from the optional input port: None\n", - "[2025-04-22 10:18:23,326] [INFO] (root) - Finding series for Selection named: CT Series\n", - "[2025-04-22 10:18:23,326] [INFO] (root) - Searching study, : 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291\n", - " # of series: 1\n", - "[2025-04-22 10:18:23,326] [INFO] (root) - Working on series, instance UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2025-04-22 10:18:23,326] [INFO] (root) - On attribute: 'StudyDescription' to match value: '(.*?)'\n", - "[2025-04-22 10:18:23,326] [INFO] (root) - Series attribute StudyDescription value: CT ABDOMEN W IV CONTRAST\n", - "[2025-04-22 10:18:23,326] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "[2025-04-22 10:18:23,326] [INFO] (root) - On attribute: 'Modality' to match value: '(?i)CT'\n", - "[2025-04-22 10:18:23,326] [INFO] (root) - Series attribute Modality value: CT\n", - "[2025-04-22 10:18:23,326] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "[2025-04-22 10:18:23,326] [INFO] (root) - On attribute: 'SeriesDescription' to match value: '(.*?)'\n", - "[2025-04-22 10:18:23,326] [INFO] (root) - Series attribute SeriesDescription value: ABD/PANC 3.0 B31f\n", - "[2025-04-22 10:18:23,326] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "[2025-04-22 10:18:23,327] [INFO] (root) - Selected Series, UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2025-04-22 10:18:23,327] [INFO] (root) - Series Selection finalized.\n", - "[2025-04-22 10:18:23,327] [INFO] (root) - Series Description of selected DICOM Series for inference: ABD/PANC 3.0 B31f\n", - "[2025-04-22 10:18:23,327] [INFO] (root) - Series Instance UID of selected DICOM Series for inference: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2025-04-22 10:18:23,535] [INFO] (root) - Casting to float32\n", - "[2025-04-22 10:18:23,592] [INFO] (root) - Parsing from bundle_path: /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/models/model/model.ts\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/monai/bundle/reference_resolver.py:216: UserWarning: Detected deprecated name 'optional_packages_version' in configuration file, replacing with 'required_packages_version'.\n", - " warnings.warn(\n", - "[2025-04-22 10:18:26,690] [INFO] (monai.deploy.operators.stl_conversion_operator.STLConversionOperator) - Output will be saved in file /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/output/stl/spleen.stl.\n", - "[2025-04-22 10:18:28,072] [INFO] (monai.deploy.operators.stl_conversion_operator.SpatialImage) - 3D image\n", - "[2025-04-22 10:18:28,072] [INFO] (monai.deploy.operators.stl_conversion_operator.STLConverter) - Image ndarray shape:(204, 512, 512)\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/highdicom/base.py:163: UserWarning: The string \"C3N-00198\" is unlikely to represent the intended person name since it contains only a single component. Construct a person name according to the format in described in https://dicom.nema.org/dicom/2013/output/chtml/part05/sect_6.2.html#sect_6.2.1.2, or, in pydicom 2.2.0 or later, use the pydicom.valuerep.PersonName.from_named_components() method to construct the person name correctly. If a single-component name is really intended, add a trailing caret character to disambiguate the name.\n", - " check_person_name(patient_name)\n", - "[2025-04-22 10:18:38,458] [INFO] (highdicom.base) - copy Image-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 10:18:38,458] [INFO] (highdicom.base) - copy attributes of module \"Specimen\"\n", - "[2025-04-22 10:18:38,458] [INFO] (highdicom.base) - copy Patient-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 10:18:38,458] [INFO] (highdicom.base) - copy attributes of module \"Patient\"\n", - "[2025-04-22 10:18:38,459] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Subject\"\n", - "[2025-04-22 10:18:38,459] [INFO] (highdicom.base) - copy Study-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 10:18:38,459] [INFO] (highdicom.base) - copy attributes of module \"General Study\"\n", - "[2025-04-22 10:18:38,459] [INFO] (highdicom.base) - copy attributes of module \"Patient Study\"\n", - "[2025-04-22 10:18:38,459] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Study\"\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:372] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:401] Scheduler finished.\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2431] Deactivating Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2439] Graph execution finished.\n", - "[2025-04-22 10:18:38,554] [INFO] (app.AISpleenSegApp) - End run\n" - ] - } - ], - "source": [ - "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", - "!python my_app -i dcm -o output -m models" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%env HOLOSCAN_INPUT_PATH dcm\n", + "%env HOLOSCAN_MODEL_PATH {models_folder}\n", + "%env HOLOSCAN_OUTPUT_PATH output" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.2.826.0.1.3680043.10.511.3.141985674848102250562862177103472.dcm stl\n" - ] - } - ], - "source": [ - "!ls output" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Packaging app\n", - "\n", - "Let's package the app with [MONAI Application Packager](/developing_with_sdk/packaging_app).\n", - "\n", - "In this version of the App SDK, we need to write out the configuration yaml file as well as the package requirements file, in the application folder." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set up imports\n", + "\n", + "Let's import necessary classes/decorators to define Application and Operator." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing my_app/app.yaml\n" - ] - } - ], - "source": [ - "%%writefile my_app/app.yaml\n", - "%YAML 1.2\n", - "---\n", - "application:\n", - " title: MONAI Deploy App Package - MONAI Bundle AI App\n", - " version: 1.0\n", - " inputFormats: [\"file\"]\n", - " outputFormats: [\"file\"]\n", - "\n", - "resources:\n", - " cpu: 1\n", - " gpu: 1\n", - " memory: 1Gi\n", - " gpuMemory: 6Gi" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "import logging\n", + "from pathlib import Path\n", + "\n", + "# Required for setting SegmentDescription attributes. Direct import as this is not part of App SDK package.\n", + "from pydicom.sr.codedict import codes\n", + "\n", + "from monai.deploy.conditions import CountCondition\n", + "from monai.deploy.core import AppContext, Application\n", + "from monai.deploy.core.domain import Image\n", + "from monai.deploy.core.io_type import IOType\n", + "from monai.deploy.operators.dicom_data_loader_operator import DICOMDataLoaderOperator\n", + "from monai.deploy.operators.dicom_seg_writer_operator import DICOMSegmentationWriterOperator, SegmentDescription\n", + "from monai.deploy.operators.dicom_series_selector_operator import DICOMSeriesSelectorOperator\n", + "from monai.deploy.operators.dicom_series_to_volume_operator import DICOMSeriesToVolumeOperator\n", + "from monai.deploy.operators.monai_bundle_inference_operator import (\n", + " BundleConfigNames,\n", + " IOMapping,\n", + " MonaiBundleInferenceOperator,\n", + ")\n", + "from monai.deploy.operators.stl_conversion_operator import STLConversionOperator\n" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing my_app/requirements.txt\n" - ] - } - ], - "source": [ - "%%writefile my_app/requirements.txt\n", - "highdicom>=0.18.2\n", - "monai>=1.0\n", - "nibabel>=3.2.1\n", - "numpy>=1.21.6\n", - "pydicom>=2.3.0\n", - "setuptools>=59.5.0 # for pkg_resources\n", - "SimpleITK>=2.0.0\n", - "scikit-image>=0.17.2\n", - "numpy-stl>=2.12.0\n", - "trimesh>=3.8.11\n", - "torch>=1.12.0\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can use the CLI package command to build the MONAI Application Package (MAP) container image based on a supported base image.\n", - "\n", - ":::{note}\n", - "Building a MONAI Application Package (Docker image) can take time. Use `-l DEBUG` option to see the progress.\n", - ":::" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Determining the Input and Output for the Model Bundle Inference Operator\n", + "\n", + "The App SDK provides a `MonaiBundleInferenceOperator` class to perform inference with a MONAI Bundle, which is essentially a PyTorch model in TorchScript with additional metadata describing the model network and processing specification. This operator uses the MONAI utilities to parse a MONAI Bundle to automatically instantiate the objects required for input and output processing as well as inference, as such it depends on MONAI transforms, inferers, and in turn their dependencies.\n", + "\n", + "Each Operator class inherits from the base `Operator` base class, and its input/output properties are specified in the `setup` function (as opposed to using decorators `@input`and `@output` in Version 0.5 and below).\n", + "\n", + "For the `MonaiBundleInferenceOperator` class, the input/output need to be defined to match those of the model network, both in name and data type. For the current release, an `IOMapping` object is used to connect the operator input/output to those of the model network by using the same names. This is likely to change, to be automated, in the future releases once certain limitation in the App SDK is removed.\n", + "\n", + "The Spleen CT Segmentation model network has a named input, called \"image\", and the named output called \"pred\", and both are of image type, which can all be mapped to the App SDK [Image](/modules/_autosummary/monai.deploy.core.domain.Image). This piece of information is typically acquired by examining the model metadata `network_data_format` attribute in the bundle, as seen in this [example] (https://github.com/Project-MONAI/model-zoo/blob/dev/models/spleen_ct_segmentation/configs/metadata.json)." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2025-04-22 10:18:40,556] [INFO] (common) - Downloading CLI manifest file...\n", - "[2025-04-22 10:18:40,770] [DEBUG] (common) - Validating CLI manifest file...\n", - "[2025-04-22 10:18:40,771] [INFO] (packager.parameters) - Application: /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/my_app\n", - "[2025-04-22 10:18:40,771] [INFO] (packager.parameters) - Detected application type: Python Module\n", - "[2025-04-22 10:18:40,771] [INFO] (packager) - Scanning for models in /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/models...\n", - "[2025-04-22 10:18:40,772] [DEBUG] (packager) - Model model=/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/models/model added.\n", - "[2025-04-22 10:18:40,772] [INFO] (packager) - Reading application configuration from /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/my_app/app.yaml...\n", - "[2025-04-22 10:18:40,776] [INFO] (packager) - Generating app.json...\n", - "[2025-04-22 10:18:40,776] [INFO] (packager) - Generating pkg.json...\n", - "[2025-04-22 10:18:40,780] [DEBUG] (common) - \n", - "=============== Begin app.json ===============\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"command\": \"[\\\"python3\\\", \\\"/opt/holoscan/app\\\"]\",\n", - " \"environment\": {\n", - " \"HOLOSCAN_APPLICATION\": \"/opt/holoscan/app\",\n", - " \"HOLOSCAN_INPUT_PATH\": \"input/\",\n", - " \"HOLOSCAN_OUTPUT_PATH\": \"output/\",\n", - " \"HOLOSCAN_WORKDIR\": \"/var/holoscan\",\n", - " \"HOLOSCAN_MODEL_PATH\": \"/opt/holoscan/models\",\n", - " \"HOLOSCAN_CONFIG_PATH\": \"/var/holoscan/app.yaml\",\n", - " \"HOLOSCAN_APP_MANIFEST_PATH\": \"/etc/holoscan/app.json\",\n", - " \"HOLOSCAN_PKG_MANIFEST_PATH\": \"/etc/holoscan/pkg.json\",\n", - " \"HOLOSCAN_DOCS_PATH\": \"/opt/holoscan/docs\",\n", - " \"HOLOSCAN_LOGS_PATH\": \"/var/holoscan/logs\"\n", - " },\n", - " \"input\": {\n", - " \"path\": \"input/\",\n", - " \"formats\": null\n", - " },\n", - " \"liveness\": null,\n", - " \"output\": {\n", - " \"path\": \"output/\",\n", - " \"formats\": null\n", - " },\n", - " \"readiness\": null,\n", - " \"sdk\": \"monai-deploy\",\n", - " \"sdkVersion\": \"0.5.1\",\n", - " \"timeout\": 0,\n", - " \"version\": 1.0,\n", - " \"workingDirectory\": \"/var/holoscan\"\n", - "}\n", - "================ End app.json ================\n", - " \n", - "[2025-04-22 10:18:40,781] [DEBUG] (common) - \n", - "=============== Begin pkg.json ===============\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"applicationRoot\": \"/opt/holoscan/app\",\n", - " \"modelRoot\": \"/opt/holoscan/models\",\n", - " \"models\": {\n", - " \"model\": \"/opt/holoscan/models/model\"\n", - " },\n", - " \"resources\": {\n", - " \"cpu\": 1,\n", - " \"gpu\": 1,\n", - " \"memory\": \"1Gi\",\n", - " \"gpuMemory\": \"6Gi\"\n", - " },\n", - " \"version\": 1.0,\n", - " \"platformConfig\": \"dgpu\"\n", - "}\n", - "================ End pkg.json ================\n", - " \n", - "[2025-04-22 10:18:40,804] [DEBUG] (packager.builder) - \n", - "========== Begin Build Parameters ==========\n", - "{'additional_lib_paths': '',\n", - " 'app_config_file_path': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/my_app/app.yaml'),\n", - " 'app_dir': PosixPath('/opt/holoscan/app'),\n", - " 'app_json': '/etc/holoscan/app.json',\n", - " 'application': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/my_app'),\n", - " 'application_directory': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/my_app'),\n", - " 'application_type': 'PythonModule',\n", - " 'build_cache': PosixPath('/home/mqin/.holoscan_build_cache'),\n", - " 'cmake_args': '',\n", - " 'command': '[\"python3\", \"/opt/holoscan/app\"]',\n", - " 'command_filename': 'my_app',\n", - " 'config_file_path': PosixPath('/var/holoscan/app.yaml'),\n", - " 'docs_dir': PosixPath('/opt/holoscan/docs'),\n", - " 'full_input_path': PosixPath('/var/holoscan/input'),\n", - " 'full_output_path': PosixPath('/var/holoscan/output'),\n", - " 'gid': 1000,\n", - " 'holoscan_sdk_version': '3.1.0',\n", - " 'includes': [],\n", - " 'input_dir': 'input/',\n", - " 'lib_dir': PosixPath('/opt/holoscan/lib'),\n", - " 'logs_dir': PosixPath('/var/holoscan/logs'),\n", - " 'models': {'model': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/models/model')},\n", - " 'models_dir': PosixPath('/opt/holoscan/models'),\n", - " 'monai_deploy_app_sdk_version': '0.5.1',\n", - " 'no_cache': False,\n", - " 'output_dir': 'output/',\n", - " 'pip_packages': None,\n", - " 'pkg_json': '/etc/holoscan/pkg.json',\n", - " 'requirements_file_path': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/my_app/requirements.txt'),\n", - " 'sdk': ,\n", - " 'sdk_type': 'monai-deploy',\n", - " 'tarball_output': None,\n", - " 'timeout': 0,\n", - " 'title': 'MONAI Deploy App Package - MONAI Bundle AI App',\n", - " 'uid': 1000,\n", - " 'username': 'holoscan',\n", - " 'version': 1.0,\n", - " 'working_dir': PosixPath('/var/holoscan')}\n", - "=========== End Build Parameters ===========\n", - "\n", - "[2025-04-22 10:18:40,805] [DEBUG] (packager.builder) - \n", - "========== Begin Platform Parameters ==========\n", - "{'base_image': 'nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04',\n", - " 'build_image': None,\n", - " 'cuda_deb_arch': 'x86_64',\n", - " 'custom_base_image': False,\n", - " 'custom_holoscan_sdk': False,\n", - " 'custom_monai_deploy_sdk': True,\n", - " 'gpu_type': 'dgpu',\n", - " 'holoscan_deb_arch': 'amd64',\n", - " 'holoscan_sdk_file': '3.1.0',\n", - " 'holoscan_sdk_filename': '3.1.0',\n", - " 'monai_deploy_sdk_file': PosixPath('/home/mqin/src/monai-deploy-app-sdk/dist/monai_deploy_app_sdk-0.5.1+37.g96f7e31.dirty-py3-none-any.whl'),\n", - " 'monai_deploy_sdk_filename': 'monai_deploy_app_sdk-0.5.1+37.g96f7e31.dirty-py3-none-any.whl',\n", - " 'tag': 'my_app:1.0',\n", - " 'target_arch': 'x86_64'}\n", - "=========== End Platform Parameters ===========\n", - "\n", - "[2025-04-22 10:18:40,822] [DEBUG] (packager.builder) - \n", - "========== Begin Dockerfile ==========\n", - "\n", - "ARG GPU_TYPE=dgpu\n", - "\n", - "\n", - "\n", - "\n", - "FROM nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04 AS base\n", - "\n", - "RUN apt-get update \\\n", - " && apt-get install -y --no-install-recommends --no-install-suggests \\\n", - " curl \\\n", - " jq \\\n", - " && rm -rf /var/lib/apt/lists/*\n", - "\n", - "\n", - "\n", - "\n", - "# FROM base AS mofed-installer\n", - "# ARG MOFED_VERSION=23.10-2.1.3.1\n", - "\n", - "# # In a container, we only need to install the user space libraries, though the drivers are still\n", - "# # needed on the host.\n", - "# # Note: MOFED's installation is not easily portable, so we can't copy the output of this stage\n", - "# # to our final stage, but must inherit from it. For that reason, we keep track of the build/install\n", - "# # only dependencies in the `MOFED_DEPS` variable (parsing the output of `--check-deps-only`) to\n", - "# # remove them in that same layer, to ensure they are not propagated in the final image.\n", - "# WORKDIR /opt/nvidia/mofed\n", - "# ARG MOFED_INSTALL_FLAGS=\"--dpdk --with-mft --user-space-only --force --without-fw-update\"\n", - "# RUN UBUNTU_VERSION=$(cat /etc/lsb-release | grep DISTRIB_RELEASE | cut -d= -f2) \\\n", - "# && OFED_PACKAGE=\"MLNX_OFED_LINUX-${MOFED_VERSION}-ubuntu${UBUNTU_VERSION}-$(uname -m)\" \\\n", - "# && curl -S -# -o ${OFED_PACKAGE}.tgz -L \\\n", - "# https://www.mellanox.com/downloads/ofed/MLNX_OFED-${MOFED_VERSION}/${OFED_PACKAGE}.tgz \\\n", - "# && tar xf ${OFED_PACKAGE}.tgz \\\n", - "# && MOFED_INSTALLER=$(find . -name mlnxofedinstall -type f -executable -print) \\\n", - "# && MOFED_DEPS=$(${MOFED_INSTALLER} ${MOFED_INSTALL_FLAGS} --check-deps-only 2>/dev/null | tail -n1 | cut -d' ' -f3-) \\\n", - "# && apt-get update \\\n", - "# && apt-get install --no-install-recommends -y ${MOFED_DEPS} \\\n", - "# && ${MOFED_INSTALLER} ${MOFED_INSTALL_FLAGS} \\\n", - "# && rm -r * \\\n", - "# && apt-get remove -y ${MOFED_DEPS} && apt-get autoremove -y \\\n", - "# && rm -rf /var/lib/apt/lists/*\n", - "\n", - "FROM base AS release\n", - "ENV DEBIAN_FRONTEND=noninteractive\n", - "ENV TERM=xterm-256color\n", - "\n", - "ARG GPU_TYPE\n", - "ARG UNAME\n", - "ARG UID\n", - "ARG GID\n", - "\n", - "RUN mkdir -p /etc/holoscan/ \\\n", - " && mkdir -p /opt/holoscan/ \\\n", - " && mkdir -p /var/holoscan \\\n", - " && mkdir -p /opt/holoscan/app \\\n", - " && mkdir -p /var/holoscan/input \\\n", - " && mkdir -p /var/holoscan/output\n", - "\n", - "LABEL base=\"nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\"\n", - "LABEL tag=\"my_app:1.0\"\n", - "LABEL org.opencontainers.image.title=\"MONAI Deploy App Package - MONAI Bundle AI App\"\n", - "LABEL org.opencontainers.image.version=\"1.0\"\n", - "LABEL org.nvidia.holoscan=\"3.1.0\"\n", - "\n", - "LABEL org.monai.deploy.app-sdk=\"0.5.1\"\n", - "\n", - "ENV HOLOSCAN_INPUT_PATH=/var/holoscan/input\n", - "ENV HOLOSCAN_OUTPUT_PATH=/var/holoscan/output\n", - "ENV HOLOSCAN_WORKDIR=/var/holoscan\n", - "ENV HOLOSCAN_APPLICATION=/opt/holoscan/app\n", - "ENV HOLOSCAN_TIMEOUT=0\n", - "ENV HOLOSCAN_MODEL_PATH=/opt/holoscan/models\n", - "ENV HOLOSCAN_DOCS_PATH=/opt/holoscan/docs\n", - "ENV HOLOSCAN_CONFIG_PATH=/var/holoscan/app.yaml\n", - "ENV HOLOSCAN_APP_MANIFEST_PATH=/etc/holoscan/app.json\n", - "ENV HOLOSCAN_PKG_MANIFEST_PATH=/etc/holoscan/pkg.json\n", - "ENV HOLOSCAN_LOGS_PATH=/var/holoscan/logs\n", - "ENV HOLOSCAN_VERSION=3.1.0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "# If torch is installed, we can skip installing Python\n", - "ENV PYTHON_VERSION=3.10.6-1~22.04\n", - "ENV PYTHON_PIP_VERSION=22.0.2+dfsg-*\n", - "\n", - "RUN apt update \\\n", - " && apt-get install -y --no-install-recommends --no-install-suggests \\\n", - " python3-minimal=${PYTHON_VERSION} \\\n", - " libpython3-stdlib=${PYTHON_VERSION} \\\n", - " python3=${PYTHON_VERSION} \\\n", - " python3-venv=${PYTHON_VERSION} \\\n", - " python3-pip=${PYTHON_PIP_VERSION} \\\n", - " && rm -rf /var/lib/apt/lists/*\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "RUN groupadd -f -g $GID $UNAME\n", - "RUN useradd -rm -d /home/$UNAME -s /bin/bash -g $GID -G sudo -u $UID $UNAME\n", - "RUN chown -R holoscan /var/holoscan && \\\n", - " chown -R holoscan /var/holoscan/input && \\\n", - " chown -R holoscan /var/holoscan/output\n", - "\n", - "# Set the working directory\n", - "WORKDIR /var/holoscan\n", - "\n", - "# Copy HAP/MAP tool script\n", - "COPY ./tools /var/holoscan/tools\n", - "RUN chmod +x /var/holoscan/tools\n", - "\n", - "# Set the working directory\n", - "WORKDIR /var/holoscan\n", - "\n", - "USER $UNAME\n", - "\n", - "ENV PATH=/home/${UNAME}/.local/bin:/opt/nvidia/holoscan/bin:$PATH\n", - "ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/${UNAME}/.local/lib/python3.10/site-packages/holoscan/lib\n", - "\n", - "COPY ./pip/requirements.txt /tmp/requirements.txt\n", - "\n", - "RUN pip install --upgrade pip\n", - "RUN pip install --no-cache-dir --user -r /tmp/requirements.txt\n", - "\n", - "\n", - "# Install MONAI Deploy App SDK\n", - "# Copy user-specified MONAI Deploy SDK file\n", - "COPY ./monai_deploy_app_sdk-0.5.1+37.g96f7e31.dirty-py3-none-any.whl /tmp/monai_deploy_app_sdk-0.5.1+37.g96f7e31.dirty-py3-none-any.whl\n", - "RUN pip install /tmp/monai_deploy_app_sdk-0.5.1+37.g96f7e31.dirty-py3-none-any.whl\n", - "\n", - "COPY ./models /opt/holoscan/models\n", - "\n", - "\n", - "COPY ./map/app.json /etc/holoscan/app.json\n", - "COPY ./app.config /var/holoscan/app.yaml\n", - "COPY ./map/pkg.json /etc/holoscan/pkg.json\n", - "\n", - "COPY ./app /opt/holoscan/app\n", - "\n", - "\n", - "ENTRYPOINT [\"/var/holoscan/tools\"]\n", - "=========== End Dockerfile ===========\n", - "\n", - "[2025-04-22 10:18:40,822] [INFO] (packager.builder) - \n", - "===============================================================================\n", - "Building image for: x64-workstation\n", - " Architecture: linux/amd64\n", - " Base Image: nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\n", - " Build Image: N/A\n", - " Cache: Enabled\n", - " Configuration: dgpu\n", - " Holoscan SDK Package: 3.1.0\n", - " MONAI Deploy App SDK Package: /home/mqin/src/monai-deploy-app-sdk/dist/monai_deploy_app_sdk-0.5.1+37.g96f7e31.dirty-py3-none-any.whl\n", - " gRPC Health Probe: N/A\n", - " SDK Version: 3.1.0\n", - " SDK: monai-deploy\n", - " Tag: my_app-x64-workstation-dgpu-linux-amd64:1.0\n", - " Included features/dependencies: N/A\n", - " \n", - "[2025-04-22 10:18:41,210] [INFO] (common) - Using existing Docker BuildKit builder `holoscan_app_builder`\n", - "[2025-04-22 10:18:41,210] [DEBUG] (packager.builder) - Building Holoscan Application Package: tag=my_app-x64-workstation-dgpu-linux-amd64:1.0\n", - "#0 building with \"holoscan_app_builder\" instance using docker-container driver\n", - "\n", - "#1 [internal] load build definition from Dockerfile\n", - "#1 transferring dockerfile: 4.74kB done\n", - "#1 DONE 0.1s\n", - "\n", - "#2 [auth] nvidia/cuda:pull token for nvcr.io\n", - "#2 DONE 0.0s\n", - "\n", - "#3 [internal] load metadata for nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\n", - "#3 DONE 0.5s\n", - "\n", - "#4 [internal] load .dockerignore\n", - "#4 transferring context: 1.80kB done\n", - "#4 DONE 0.1s\n", - "\n", - "#5 importing cache manifest from local:3932312145486245041\n", - "#5 inferred cache manifest type: application/vnd.oci.image.index.v1+json done\n", - "#5 DONE 0.0s\n", - "\n", - "#6 [internal] load build context\n", - "#6 DONE 0.0s\n", - "\n", - "#7 [base 1/2] FROM nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04@sha256:22fc009e5cea0b8b91d94c99fdd419d2366810b5ea835e47b8343bc15800c186\n", - "#7 resolve nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04@sha256:22fc009e5cea0b8b91d94c99fdd419d2366810b5ea835e47b8343bc15800c186 0.0s done\n", - "#7 DONE 0.0s\n", - "\n", - "#8 importing cache manifest from nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\n", - "#8 inferred cache manifest type: application/vnd.docker.distribution.manifest.list.v2+json done\n", - "#8 DONE 0.3s\n", - "\n", - "#6 [internal] load build context\n", - "#6 transferring context: 19.58MB 0.1s done\n", - "#6 DONE 0.5s\n", - "\n", - "#9 [release 4/19] RUN useradd -rm -d /home/holoscan -s /bin/bash -g 1000 -G sudo -u 1000 holoscan\n", - "#9 CACHED\n", - "\n", - "#10 [release 5/19] RUN chown -R holoscan /var/holoscan && chown -R holoscan /var/holoscan/input && chown -R holoscan /var/holoscan/output\n", - "#10 CACHED\n", - "\n", - "#11 [release 3/19] RUN groupadd -f -g 1000 holoscan\n", - "#11 CACHED\n", - "\n", - "#12 [release 6/19] WORKDIR /var/holoscan\n", - "#12 CACHED\n", - "\n", - "#13 [release 7/19] COPY ./tools /var/holoscan/tools\n", - "#13 CACHED\n", - "\n", - "#14 [release 8/19] RUN chmod +x /var/holoscan/tools\n", - "#14 CACHED\n", - "\n", - "#15 [release 1/19] RUN mkdir -p /etc/holoscan/ && mkdir -p /opt/holoscan/ && mkdir -p /var/holoscan && mkdir -p /opt/holoscan/app && mkdir -p /var/holoscan/input && mkdir -p /var/holoscan/output\n", - "#15 CACHED\n", - "\n", - "#16 [release 2/19] RUN apt update && apt-get install -y --no-install-recommends --no-install-suggests python3-minimal=3.10.6-1~22.04 libpython3-stdlib=3.10.6-1~22.04 python3=3.10.6-1~22.04 python3-venv=3.10.6-1~22.04 python3-pip=22.0.2+dfsg-* && rm -rf /var/lib/apt/lists/*\n", - "#16 CACHED\n", - "\n", - "#17 [base 2/2] RUN apt-get update && apt-get install -y --no-install-recommends --no-install-suggests curl jq && rm -rf /var/lib/apt/lists/*\n", - "#17 CACHED\n", - "\n", - "#18 [release 9/19] WORKDIR /var/holoscan\n", - "#18 CACHED\n", - "\n", - "#19 [release 10/19] COPY ./pip/requirements.txt /tmp/requirements.txt\n", - "#19 DONE 0.2s\n", - "\n", - "#20 [release 11/19] RUN pip install --upgrade pip\n", - "#20 0.826 Defaulting to user installation because normal site-packages is not writeable\n", - "#20 0.854 Requirement already satisfied: pip in /usr/lib/python3/dist-packages (22.0.2)\n", - "#20 1.009 Collecting pip\n", - "#20 1.083 Downloading pip-25.0.1-py3-none-any.whl (1.8 MB)\n", - "#20 1.257 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 10.9 MB/s eta 0:00:00\n", - "#20 1.288 Installing collected packages: pip\n", - "#20 2.028 Successfully installed pip-25.0.1\n", - "#20 DONE 2.2s\n", - "\n", - "#21 [release 12/19] RUN pip install --no-cache-dir --user -r /tmp/requirements.txt\n", - "#21 0.646 Collecting highdicom>=0.18.2 (from -r /tmp/requirements.txt (line 1))\n", - "#21 0.682 Downloading highdicom-0.25.1-py3-none-any.whl.metadata (5.0 kB)\n", - "#21 0.718 Collecting monai>=1.0 (from -r /tmp/requirements.txt (line 2))\n", - "#21 0.731 Downloading monai-1.4.0-py3-none-any.whl.metadata (11 kB)\n", - "#21 0.833 Collecting nibabel>=3.2.1 (from -r /tmp/requirements.txt (line 3))\n", - "#21 0.845 Downloading nibabel-5.3.2-py3-none-any.whl.metadata (9.1 kB)\n", - "#21 1.074 Collecting numpy>=1.21.6 (from -r /tmp/requirements.txt (line 4))\n", - "#21 1.085 Downloading numpy-2.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (62 kB)\n", - "#21 1.122 Collecting pydicom>=2.3.0 (from -r /tmp/requirements.txt (line 5))\n", - "#21 1.136 Downloading pydicom-3.0.1-py3-none-any.whl.metadata (9.4 kB)\n", - "#21 1.144 Requirement already satisfied: setuptools>=59.5.0 in /usr/lib/python3/dist-packages (from -r /tmp/requirements.txt (line 6)) (59.6.0)\n", - "#21 1.183 Collecting SimpleITK>=2.0.0 (from -r /tmp/requirements.txt (line 7))\n", - "#21 1.193 Downloading SimpleITK-2.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (7.9 kB)\n", - "#21 1.259 Collecting scikit-image>=0.17.2 (from -r /tmp/requirements.txt (line 8))\n", - "#21 1.270 Downloading scikit_image-0.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (14 kB)\n", - "#21 1.303 Collecting numpy-stl>=2.12.0 (from -r /tmp/requirements.txt (line 9))\n", - "#21 1.315 Downloading numpy_stl-3.2.0-py3-none-any.whl.metadata (18 kB)\n", - "#21 1.414 Collecting trimesh>=3.8.11 (from -r /tmp/requirements.txt (line 10))\n", - "#21 1.425 Downloading trimesh-4.6.8-py3-none-any.whl.metadata (18 kB)\n", - "#21 1.477 Collecting torch>=1.12.0 (from -r /tmp/requirements.txt (line 11))\n", - "#21 1.488 Downloading torch-2.6.0-cp310-cp310-manylinux1_x86_64.whl.metadata (28 kB)\n", - "#21 1.650 Collecting pillow>=8.3 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 1))\n", - "#21 1.662 Downloading pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl.metadata (8.9 kB)\n", - "#21 1.711 Collecting pyjpegls>=1.0.0 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 1))\n", - "#21 1.724 Downloading pyjpegls-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.5 kB)\n", - "#21 1.757 Collecting typing-extensions>=4.0.0 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 1))\n", - "#21 1.771 Downloading typing_extensions-4.13.2-py3-none-any.whl.metadata (3.0 kB)\n", - "#21 1.797 Collecting numpy>=1.21.6 (from -r /tmp/requirements.txt (line 4))\n", - "#21 1.819 Downloading numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)\n", - "#21 1.859 Collecting importlib-resources>=5.12 (from nibabel>=3.2.1->-r /tmp/requirements.txt (line 3))\n", - "#21 1.871 Downloading importlib_resources-6.5.2-py3-none-any.whl.metadata (3.9 kB)\n", - "#21 1.923 Collecting packaging>=20 (from nibabel>=3.2.1->-r /tmp/requirements.txt (line 3))\n", - "#21 1.934 Downloading packaging-25.0-py3-none-any.whl.metadata (3.3 kB)\n", - "#21 2.041 Collecting scipy>=1.11.4 (from scikit-image>=0.17.2->-r /tmp/requirements.txt (line 8))\n", - "#21 2.052 Downloading scipy-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)\n", - "#21 2.086 Collecting networkx>=3.0 (from scikit-image>=0.17.2->-r /tmp/requirements.txt (line 8))\n", - "#21 2.097 Downloading networkx-3.4.2-py3-none-any.whl.metadata (6.3 kB)\n", - "#21 2.139 Collecting imageio!=2.35.0,>=2.33 (from scikit-image>=0.17.2->-r /tmp/requirements.txt (line 8))\n", - "#21 2.151 Downloading imageio-2.37.0-py3-none-any.whl.metadata (5.2 kB)\n", - "#21 2.212 Collecting tifffile>=2022.8.12 (from scikit-image>=0.17.2->-r /tmp/requirements.txt (line 8))\n", - "#21 2.224 Downloading tifffile-2025.3.30-py3-none-any.whl.metadata (32 kB)\n", - "#21 2.248 Collecting lazy-loader>=0.4 (from scikit-image>=0.17.2->-r /tmp/requirements.txt (line 8))\n", - "#21 2.259 Downloading lazy_loader-0.4-py3-none-any.whl.metadata (7.6 kB)\n", - "#21 2.293 Collecting python-utils>=3.4.5 (from numpy-stl>=2.12.0->-r /tmp/requirements.txt (line 9))\n", - "#21 2.305 Downloading python_utils-3.9.1-py2.py3-none-any.whl.metadata (9.8 kB)\n", - "#21 2.367 Collecting filelock (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.378 Downloading filelock-3.18.0-py3-none-any.whl.metadata (2.9 kB)\n", - "#21 2.412 Collecting jinja2 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.423 Downloading jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB)\n", - "#21 2.457 Collecting fsspec (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.468 Downloading fsspec-2025.3.2-py3-none-any.whl.metadata (11 kB)\n", - "#21 2.550 Collecting nvidia-cuda-nvrtc-cu12==12.4.127 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.561 Downloading nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.581 Collecting nvidia-cuda-runtime-cu12==12.4.127 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.592 Downloading nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.612 Collecting nvidia-cuda-cupti-cu12==12.4.127 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.623 Downloading nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", - "#21 2.642 Collecting nvidia-cudnn-cu12==9.1.0.70 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.653 Downloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", - "#21 2.672 Collecting nvidia-cublas-cu12==12.4.5.8 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.683 Downloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.702 Collecting nvidia-cufft-cu12==11.2.1.3 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.714 Downloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.733 Collecting nvidia-curand-cu12==10.3.5.147 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.743 Downloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.762 Collecting nvidia-cusolver-cu12==11.6.1.9 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.773 Downloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", - "#21 2.804 Collecting nvidia-cusparse-cu12==12.3.1.170 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.815 Downloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", - "#21 2.831 Collecting nvidia-cusparselt-cu12==0.6.2 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.842 Downloading nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl.metadata (6.8 kB)\n", - "#21 2.861 Collecting nvidia-nccl-cu12==2.21.5 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.872 Downloading nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl.metadata (1.8 kB)\n", - "#21 2.895 Collecting nvidia-nvtx-cu12==12.4.127 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.907 Downloading nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.7 kB)\n", - "#21 2.930 Collecting nvidia-nvjitlink-cu12==12.4.127 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.941 Downloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.960 Collecting triton==3.2.0 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 2.972 Downloading triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.4 kB)\n", - "#21 3.045 Collecting sympy==1.13.1 (from torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 3.055 Downloading sympy-1.13.1-py3-none-any.whl.metadata (12 kB)\n", - "#21 3.090 Collecting mpmath<1.4,>=1.1.0 (from sympy==1.13.1->torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 3.102 Downloading mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB)\n", - "#21 3.144 INFO: pip is looking at multiple versions of pyjpegls to determine which version is compatible with other requirements. This could take a while.\n", - "#21 3.145 Collecting pyjpegls>=1.0.0 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 1))\n", - "#21 3.156 Downloading pyjpegls-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.5 kB)\n", - "#21 3.170 Downloading pyjpegls-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.5 kB)\n", - "#21 3.252 Collecting MarkupSafe>=2.0 (from jinja2->torch>=1.12.0->-r /tmp/requirements.txt (line 11))\n", - "#21 3.263 Downloading MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.0 kB)\n", - "#21 3.280 Downloading highdicom-0.25.1-py3-none-any.whl (1.1 MB)\n", - "#21 3.313 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 51.4 MB/s eta 0:00:00\n", - "#21 3.328 Downloading monai-1.4.0-py3-none-any.whl (1.5 MB)\n", - "#21 3.349 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.5/1.5 MB 89.2 MB/s eta 0:00:00\n", - "#21 3.364 Downloading nibabel-5.3.2-py3-none-any.whl (3.3 MB)\n", - "#21 3.416 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3/3.3 MB 67.6 MB/s eta 0:00:00\n", - "#21 3.431 Downloading numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.2 MB)\n", - "#21 3.685 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 18.2/18.2 MB 73.4 MB/s eta 0:00:00\n", - "#21 3.700 Downloading pydicom-3.0.1-py3-none-any.whl (2.4 MB)\n", - "#21 3.736 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.4/2.4 MB 75.0 MB/s eta 0:00:00\n", - "#21 3.751 Downloading SimpleITK-2.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (52.4 MB)\n", - "#21 4.363 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 52.4/52.4 MB 86.5 MB/s eta 0:00:00\n", - "#21 4.377 Downloading scikit_image-0.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (14.8 MB)\n", - "#21 4.533 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 14.8/14.8 MB 97.9 MB/s eta 0:00:00\n", - "#21 4.556 Downloading numpy_stl-3.2.0-py3-none-any.whl (20 kB)\n", - "#21 4.571 Downloading trimesh-4.6.8-py3-none-any.whl (709 kB)\n", - "#21 4.581 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 709.3/709.3 kB 201.3 MB/s eta 0:00:00\n", - "#21 4.598 Downloading torch-2.6.0-cp310-cp310-manylinux1_x86_64.whl (766.7 MB)\n", - "#21 11.67 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 766.7/766.7 MB 106.7 MB/s eta 0:00:00\n", - "#21 11.69 Downloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl (363.4 MB)\n", - "#21 14.89 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 363.4/363.4 MB 115.9 MB/s eta 0:00:00\n", - "#21 14.90 Downloading nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (13.8 MB)\n", - "#21 15.04 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.8/13.8 MB 100.5 MB/s eta 0:00:00\n", - "#21 15.06 Downloading nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (24.6 MB)\n", - "#21 15.31 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 24.6/24.6 MB 98.3 MB/s eta 0:00:00\n", - "#21 15.32 Downloading nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (883 kB)\n", - "#21 15.34 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 883.7/883.7 kB 95.7 MB/s eta 0:00:00\n", - "#21 15.35 Downloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl (664.8 MB)\n", - "#21 21.33 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 664.8/664.8 MB 109.3 MB/s eta 0:00:00\n", - "#21 21.34 Downloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl (211.5 MB)\n", - "#21 23.17 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 211.5/211.5 MB 116.0 MB/s eta 0:00:00\n", - "#21 23.19 Downloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl (56.3 MB)\n", - "#21 23.78 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 56.3/56.3 MB 95.6 MB/s eta 0:00:00\n", - "#21 23.80 Downloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl (127.9 MB)\n", - "#21 25.04 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 127.9/127.9 MB 103.4 MB/s eta 0:00:00\n", - "#21 25.05 Downloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl (207.5 MB)\n", - "#21 26.90 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 207.5/207.5 MB 112.6 MB/s eta 0:00:00\n", - "#21 26.92 Downloading nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl (150.1 MB)\n", - "#21 28.26 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 150.1/150.1 MB 112.3 MB/s eta 0:00:00\n", - "#21 28.27 Downloading nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl (188.7 MB)\n", - "#21 30.00 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 188.7/188.7 MB 109.4 MB/s eta 0:00:00\n", - "#21 30.01 Downloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (21.1 MB)\n", - "#21 30.20 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 21.1/21.1 MB 113.9 MB/s eta 0:00:00\n", - "#21 30.21 Downloading nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (99 kB)\n", - "#21 30.23 Downloading sympy-1.13.1-py3-none-any.whl (6.2 MB)\n", - "#21 30.29 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.2/6.2 MB 119.1 MB/s eta 0:00:00\n", - "#21 30.30 Downloading triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (253.1 MB)\n", - "#21 32.93 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 253.1/253.1 MB 96.3 MB/s eta 0:00:00\n", - "#21 32.95 Downloading imageio-2.37.0-py3-none-any.whl (315 kB)\n", - "#21 32.96 Downloading importlib_resources-6.5.2-py3-none-any.whl (37 kB)\n", - "#21 32.98 Downloading lazy_loader-0.4-py3-none-any.whl (12 kB)\n", - "#21 32.99 Downloading networkx-3.4.2-py3-none-any.whl (1.7 MB)\n", - "#21 33.01 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 113.8 MB/s eta 0:00:00\n", - "#21 33.02 Downloading packaging-25.0-py3-none-any.whl (66 kB)\n", - "#21 33.04 Downloading pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl (4.6 MB)\n", - "#21 33.09 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.6/4.6 MB 107.2 MB/s eta 0:00:00\n", - "#21 33.10 Downloading pyjpegls-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.7 MB)\n", - "#21 33.13 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.7/2.7 MB 104.8 MB/s eta 0:00:00\n", - "#21 33.14 Downloading python_utils-3.9.1-py2.py3-none-any.whl (32 kB)\n", - "#21 33.15 Downloading scipy-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (37.6 MB)\n", - "#21 33.50 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 37.6/37.6 MB 111.2 MB/s eta 0:00:00\n", - "#21 33.51 Downloading tifffile-2025.3.30-py3-none-any.whl (226 kB)\n", - "#21 33.53 Downloading typing_extensions-4.13.2-py3-none-any.whl (45 kB)\n", - "#21 33.54 Downloading filelock-3.18.0-py3-none-any.whl (16 kB)\n", - "#21 33.56 Downloading fsspec-2025.3.2-py3-none-any.whl (194 kB)\n", - "#21 33.57 Downloading jinja2-3.1.6-py3-none-any.whl (134 kB)\n", - "#21 33.59 Downloading MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20 kB)\n", - "#21 33.60 Downloading mpmath-1.3.0-py3-none-any.whl (536 kB)\n", - "#21 33.61 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 536.2/536.2 kB 201.5 MB/s eta 0:00:00\n", - "#21 41.09 Installing collected packages: triton, SimpleITK, nvidia-cusparselt-cu12, mpmath, typing-extensions, sympy, pydicom, pillow, packaging, nvidia-nvtx-cu12, nvidia-nvjitlink-cu12, nvidia-nccl-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, numpy, networkx, MarkupSafe, importlib-resources, fsspec, filelock, trimesh, tifffile, scipy, python-utils, pyjpegls, nvidia-cusparse-cu12, nvidia-cudnn-cu12, nibabel, lazy-loader, jinja2, imageio, scikit-image, nvidia-cusolver-cu12, numpy-stl, highdicom, torch, monai\n", - "#21 113.8 Successfully installed MarkupSafe-3.0.2 SimpleITK-2.4.1 filelock-3.18.0 fsspec-2025.3.2 highdicom-0.25.1 imageio-2.37.0 importlib-resources-6.5.2 jinja2-3.1.6 lazy-loader-0.4 monai-1.4.0 mpmath-1.3.0 networkx-3.4.2 nibabel-5.3.2 numpy-1.26.4 numpy-stl-3.2.0 nvidia-cublas-cu12-12.4.5.8 nvidia-cuda-cupti-cu12-12.4.127 nvidia-cuda-nvrtc-cu12-12.4.127 nvidia-cuda-runtime-cu12-12.4.127 nvidia-cudnn-cu12-9.1.0.70 nvidia-cufft-cu12-11.2.1.3 nvidia-curand-cu12-10.3.5.147 nvidia-cusolver-cu12-11.6.1.9 nvidia-cusparse-cu12-12.3.1.170 nvidia-cusparselt-cu12-0.6.2 nvidia-nccl-cu12-2.21.5 nvidia-nvjitlink-cu12-12.4.127 nvidia-nvtx-cu12-12.4.127 packaging-25.0 pillow-11.2.1 pydicom-3.0.1 pyjpegls-1.4.0 python-utils-3.9.1 scikit-image-0.25.2 scipy-1.15.2 sympy-1.13.1 tifffile-2025.3.30 torch-2.6.0 trimesh-4.6.8 triton-3.2.0 typing-extensions-4.13.2\n", - "#21 DONE 117.7s\n", - "\n", - "#22 [release 13/19] COPY ./monai_deploy_app_sdk-0.5.1+37.g96f7e31.dirty-py3-none-any.whl /tmp/monai_deploy_app_sdk-0.5.1+37.g96f7e31.dirty-py3-none-any.whl\n", - "#22 DONE 0.5s\n", - "\n", - "#23 [release 14/19] RUN pip install /tmp/monai_deploy_app_sdk-0.5.1+37.g96f7e31.dirty-py3-none-any.whl\n", - "#23 0.662 Defaulting to user installation because normal site-packages is not writeable\n", - "#23 0.785 Processing /tmp/monai_deploy_app_sdk-0.5.1+37.g96f7e31.dirty-py3-none-any.whl\n", - "#23 0.794 Requirement already satisfied: numpy>=1.21.6 in /home/holoscan/.local/lib/python3.10/site-packages (from monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty) (1.26.4)\n", - "#23 0.876 Collecting holoscan~=3.0 (from monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 0.901 Downloading holoscan-3.1.0-cp310-cp310-manylinux_2_35_x86_64.whl.metadata (7.0 kB)\n", - "#23 0.960 Collecting holoscan-cli~=3.0 (from monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 0.967 Downloading holoscan_cli-3.1.0-py3-none-any.whl.metadata (4.0 kB)\n", - "#23 1.037 Collecting colorama>=0.4.1 (from monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 1.043 Downloading colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB)\n", - "#23 1.119 Collecting tritonclient>=2.53.0 (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 1.124 Downloading tritonclient-2.56.0-py3-none-manylinux1_x86_64.whl.metadata (2.8 kB)\n", - "#23 1.217 Collecting typeguard>=3.0.0 (from monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 1.222 Downloading typeguard-4.4.2-py3-none-any.whl.metadata (3.8 kB)\n", - "#23 1.252 Requirement already satisfied: pip>22.0.2 in /home/holoscan/.local/lib/python3.10/site-packages (from holoscan~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty) (25.0.1)\n", - "#23 1.303 Collecting cupy-cuda12x<14.0,>=12.2 (from holoscan~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 1.308 Downloading cupy_cuda12x-13.4.1-cp310-cp310-manylinux2014_x86_64.whl.metadata (2.6 kB)\n", - "#23 1.380 Collecting cloudpickle<4.0,>=3.0 (from holoscan~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 1.385 Downloading cloudpickle-3.1.1-py3-none-any.whl.metadata (7.1 kB)\n", - "#23 1.439 Collecting wheel-axle-runtime<1.0 (from holoscan~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 1.445 Downloading wheel_axle_runtime-0.0.6-py3-none-any.whl.metadata (8.1 kB)\n", - "#23 1.467 Requirement already satisfied: Jinja2<4.0.0,>=3.1.5 in /home/holoscan/.local/lib/python3.10/site-packages (from holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty) (3.1.6)\n", - "#23 1.515 Collecting packaging<24.0,>=23.1 (from holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 1.520 Downloading packaging-23.2-py3-none-any.whl.metadata (3.2 kB)\n", - "#23 1.646 Collecting psutil<7.0.0,>=6.0.0 (from holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 1.650 Downloading psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (22 kB)\n", - "#23 1.724 Collecting python-on-whales<0.61.0,>=0.60.1 (from holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 1.731 Downloading python_on_whales-0.60.1-py3-none-any.whl.metadata (16 kB)\n", - "#23 1.816 Collecting pyyaml<7.0,>=6.0 (from holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 1.820 Downloading PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.1 kB)\n", - "#23 1.904 Collecting requests<3.0.0,>=2.31.0 (from holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 1.908 Downloading requests-2.32.3-py3-none-any.whl.metadata (4.6 kB)\n", - "#23 2.039 Collecting python-rapidjson>=0.9.1 (from tritonclient>=2.53.0->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 2.044 Downloading python_rapidjson-1.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (22 kB)\n", - "#23 2.122 Collecting urllib3>=2.0.7 (from tritonclient>=2.53.0->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 2.126 Downloading urllib3-2.4.0-py3-none-any.whl.metadata (6.5 kB)\n", - "#23 2.575 Collecting aiohttp<4.0.0,>=3.8.1 (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 2.579 Downloading aiohttp-3.11.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (7.7 kB)\n", - "#23 2.661 Collecting cuda-python (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 2.665 Downloading cuda_python-12.8.0-py3-none-any.whl.metadata (15 kB)\n", - "#23 2.815 Collecting geventhttpclient>=2.3.3 (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 2.825 Downloading geventhttpclient-2.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (9.7 kB)\n", - "#23 3.334 Collecting grpcio<1.68,>=1.63.0 (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 3.339 Downloading grpcio-1.67.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.9 kB)\n", - "#23 3.555 Collecting protobuf<6.0dev,>=5.26.1 (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 3.559 Downloading protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl.metadata (592 bytes)\n", - "#23 3.577 Requirement already satisfied: typing_extensions>=4.10.0 in /home/holoscan/.local/lib/python3.10/site-packages (from typeguard>=3.0.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty) (4.13.2)\n", - "#23 3.626 Collecting aiohappyeyeballs>=2.3.0 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 3.632 Downloading aiohappyeyeballs-2.6.1-py3-none-any.whl.metadata (5.9 kB)\n", - "#23 3.676 Collecting aiosignal>=1.1.2 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 3.681 Downloading aiosignal-1.3.2-py2.py3-none-any.whl.metadata (3.8 kB)\n", - "#23 3.748 Collecting async-timeout<6.0,>=4.0 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 3.753 Downloading async_timeout-5.0.1-py3-none-any.whl.metadata (5.1 kB)\n", - "#23 3.817 Collecting attrs>=17.3.0 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 3.823 Downloading attrs-25.3.0-py3-none-any.whl.metadata (10 kB)\n", - "#23 3.935 Collecting frozenlist>=1.1.1 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 3.940 Downloading frozenlist-1.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (16 kB)\n", - "#23 4.201 Collecting multidict<7.0,>=4.5 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 4.205 Downloading multidict-6.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.3 kB)\n", - "#23 4.297 Collecting propcache>=0.2.0 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 4.301 Downloading propcache-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (10 kB)\n", - "#23 4.611 Collecting yarl<2.0,>=1.17.0 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 4.615 Downloading yarl-1.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (72 kB)\n", - "#23 4.699 Collecting fastrlock>=0.5 (from cupy-cuda12x<14.0,>=12.2->holoscan~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 4.704 Downloading fastrlock-0.8.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl.metadata (7.7 kB)\n", - "#23 4.843 Collecting gevent (from geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 4.847 Downloading gevent-25.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (13 kB)\n", - "#23 4.925 Collecting certifi (from geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 4.929 Downloading certifi-2025.1.31-py3-none-any.whl.metadata (2.5 kB)\n", - "#23 5.003 Collecting brotli (from geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 5.007 Downloading Brotli-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.metadata (5.5 kB)\n", - "#23 5.027 Requirement already satisfied: MarkupSafe>=2.0 in /home/holoscan/.local/lib/python3.10/site-packages (from Jinja2<4.0.0,>=3.1.5->holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty) (3.0.2)\n", - "#23 5.170 Collecting pydantic<2,>=1.5 (from python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 5.175 Downloading pydantic-1.10.21-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (153 kB)\n", - "#23 5.306 Collecting tqdm (from python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 5.310 Downloading tqdm-4.67.1-py3-none-any.whl.metadata (57 kB)\n", - "#23 5.387 Collecting typer>=0.4.1 (from python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 5.393 Downloading typer-0.15.2-py3-none-any.whl.metadata (15 kB)\n", - "#23 5.514 Collecting charset-normalizer<4,>=2 (from requests<3.0.0,>=2.31.0->holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 5.558 Downloading charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (35 kB)\n", - "#23 5.628 Collecting idna<4,>=2.5 (from requests<3.0.0,>=2.31.0->holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 5.633 Downloading idna-3.10-py3-none-any.whl.metadata (10 kB)\n", - "#23 5.678 Requirement already satisfied: filelock in /home/holoscan/.local/lib/python3.10/site-packages (from wheel-axle-runtime<1.0->holoscan~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty) (3.18.0)\n", - "#23 5.710 Collecting cuda-bindings~=12.8.0 (from cuda-python->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 5.716 Downloading cuda_bindings-12.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (13 kB)\n", - "#23 5.807 Collecting click>=8.0.0 (from typer>=0.4.1->python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 5.812 Downloading click-8.1.8-py3-none-any.whl.metadata (2.3 kB)\n", - "#23 5.872 Collecting shellingham>=1.3.0 (from typer>=0.4.1->python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 5.878 Downloading shellingham-1.5.4-py2.py3-none-any.whl.metadata (3.5 kB)\n", - "#23 5.971 Collecting rich>=10.11.0 (from typer>=0.4.1->python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 5.975 Downloading rich-14.0.0-py3-none-any.whl.metadata (18 kB)\n", - "#23 6.146 Collecting greenlet>=3.2.0 (from gevent->geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 6.150 Downloading greenlet-3.2.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (4.1 kB)\n", - "#23 6.201 Collecting zope.event (from gevent->geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 6.208 Downloading zope.event-5.0-py3-none-any.whl.metadata (4.4 kB)\n", - "#23 6.362 Collecting zope.interface (from gevent->geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 6.367 Downloading zope.interface-7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (44 kB)\n", - "#23 6.448 Collecting markdown-it-py>=2.2.0 (from rich>=10.11.0->typer>=0.4.1->python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 6.453 Downloading markdown_it_py-3.0.0-py3-none-any.whl.metadata (6.9 kB)\n", - "#23 6.524 Collecting pygments<3.0.0,>=2.13.0 (from rich>=10.11.0->typer>=0.4.1->python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 6.529 Downloading pygments-2.19.1-py3-none-any.whl.metadata (2.5 kB)\n", - "#23 6.548 Requirement already satisfied: setuptools in /usr/lib/python3/dist-packages (from zope.event->gevent->geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty) (59.6.0)\n", - "#23 6.591 Collecting mdurl~=0.1 (from markdown-it-py>=2.2.0->rich>=10.11.0->typer>=0.4.1->python-on-whales<0.61.0,>=0.60.1->holoscan-cli~=3.0->monai-deploy-app-sdk==0.5.1+37.g96f7e31.dirty)\n", - "#23 6.598 Downloading mdurl-0.1.2-py3-none-any.whl.metadata (1.6 kB)\n", - "#23 6.645 Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)\n", - "#23 6.667 Downloading holoscan-3.1.0-cp310-cp310-manylinux_2_35_x86_64.whl (39.8 MB)\n", - "#23 8.166 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 39.8/39.8 MB 26.6 MB/s eta 0:00:00\n", - "#23 8.172 Downloading holoscan_cli-3.1.0-py3-none-any.whl (72 kB)\n", - "#23 8.194 Downloading tritonclient-2.56.0-py3-none-manylinux1_x86_64.whl (14.4 MB)\n", - "#23 8.442 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 14.4/14.4 MB 59.4 MB/s eta 0:00:00\n", - "#23 8.449 Downloading typeguard-4.4.2-py3-none-any.whl (35 kB)\n", - "#23 8.477 Downloading aiohttp-3.11.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB)\n", - "#23 8.516 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 39.9 MB/s eta 0:00:00\n", - "#23 8.522 Downloading cloudpickle-3.1.1-py3-none-any.whl (20 kB)\n", - "#23 8.545 Downloading cupy_cuda12x-13.4.1-cp310-cp310-manylinux2014_x86_64.whl (104.6 MB)\n", - "#23 10.10 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 104.6/104.6 MB 67.4 MB/s eta 0:00:00\n", - "#23 10.11 Downloading geventhttpclient-2.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (112 kB)\n", - "#23 10.14 Downloading grpcio-1.67.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.9 MB)\n", - "#23 10.25 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.9/5.9 MB 54.0 MB/s eta 0:00:00\n", - "#23 10.26 Downloading packaging-23.2-py3-none-any.whl (53 kB)\n", - "#23 10.28 Downloading protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl (319 kB)\n", - "#23 10.31 Downloading psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (287 kB)\n", - "#23 10.34 Downloading python_on_whales-0.60.1-py3-none-any.whl (103 kB)\n", - "#23 10.36 Downloading python_rapidjson-1.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.7 MB)\n", - "#23 10.41 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 37.3 MB/s eta 0:00:00\n", - "#23 10.41 Downloading PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (751 kB)\n", - "#23 10.45 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 751.2/751.2 kB 18.5 MB/s eta 0:00:00\n", - "#23 10.45 Downloading requests-2.32.3-py3-none-any.whl (64 kB)\n", - "#23 10.48 Downloading urllib3-2.4.0-py3-none-any.whl (128 kB)\n", - "#23 10.50 Downloading wheel_axle_runtime-0.0.6-py3-none-any.whl (14 kB)\n", - "#23 10.53 Downloading cuda_python-12.8.0-py3-none-any.whl (11 kB)\n", - "#23 10.55 Downloading aiohappyeyeballs-2.6.1-py3-none-any.whl (15 kB)\n", - "#23 10.57 Downloading aiosignal-1.3.2-py2.py3-none-any.whl (7.6 kB)\n", - "#23 10.59 Downloading async_timeout-5.0.1-py3-none-any.whl (6.2 kB)\n", - "#23 10.62 Downloading attrs-25.3.0-py3-none-any.whl (63 kB)\n", - "#23 10.64 Downloading certifi-2025.1.31-py3-none-any.whl (166 kB)\n", - "#23 10.67 Downloading charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (146 kB)\n", - "#23 10.69 Downloading cuda_bindings-12.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.4 MB)\n", - "#23 10.89 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.4/11.4 MB 59.7 MB/s eta 0:00:00\n", - "#23 10.90 Downloading fastrlock-0.8.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl (53 kB)\n", - "#23 10.92 Downloading frozenlist-1.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (287 kB)\n", - "#23 10.95 Downloading idna-3.10-py3-none-any.whl (70 kB)\n", - "#23 10.97 Downloading multidict-6.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (219 kB)\n", - "#23 10.99 Downloading propcache-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (206 kB)\n", - "#23 11.02 Downloading pydantic-1.10.21-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.3 MB)\n", - "#23 11.09 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3/3.3 MB 49.4 MB/s eta 0:00:00\n", - "#23 11.10 Downloading typer-0.15.2-py3-none-any.whl (45 kB)\n", - "#23 11.13 Downloading yarl-1.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (333 kB)\n", - "#23 11.16 Downloading Brotli-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (3.0 MB)\n", - "#23 11.22 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.0/3.0 MB 51.6 MB/s eta 0:00:00\n", - "#23 11.22 Downloading gevent-25.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB)\n", - "#23 11.27 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2/2.2 MB 44.4 MB/s eta 0:00:00\n", - "#23 11.28 Downloading tqdm-4.67.1-py3-none-any.whl (78 kB)\n", - "#23 11.31 Downloading click-8.1.8-py3-none-any.whl (98 kB)\n", - "#23 11.34 Downloading greenlet-3.2.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (580 kB)\n", - "#23 11.37 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 580.6/580.6 kB 15.5 MB/s eta 0:00:00\n", - "#23 11.37 Downloading rich-14.0.0-py3-none-any.whl (243 kB)\n", - "#23 11.40 Downloading shellingham-1.5.4-py2.py3-none-any.whl (9.8 kB)\n", - "#23 11.42 Downloading zope.event-5.0-py3-none-any.whl (6.8 kB)\n", - "#23 11.45 Downloading zope.interface-7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (254 kB)\n", - "#23 11.47 Downloading markdown_it_py-3.0.0-py3-none-any.whl (87 kB)\n", - "#23 11.50 Downloading pygments-2.19.1-py3-none-any.whl (1.2 MB)\n", - "#23 11.54 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 31.5 MB/s eta 0:00:00\n", - "#23 11.54 Downloading mdurl-0.1.2-py3-none-any.whl (10.0 kB)\n", - "#23 12.43 Installing collected packages: fastrlock, cuda-bindings, brotli, zope.interface, zope.event, wheel-axle-runtime, urllib3, typeguard, tqdm, shellingham, pyyaml, python-rapidjson, pygments, pydantic, psutil, protobuf, propcache, packaging, multidict, mdurl, idna, grpcio, greenlet, frozenlist, cupy-cuda12x, cuda-python, colorama, cloudpickle, click, charset-normalizer, certifi, attrs, async-timeout, aiohappyeyeballs, yarl, tritonclient, requests, markdown-it-py, holoscan, gevent, aiosignal, rich, geventhttpclient, aiohttp, typer, python-on-whales, holoscan-cli, monai-deploy-app-sdk\n", - "#23 14.37 Attempting uninstall: packaging\n", - "#23 14.37 Found existing installation: packaging 25.0\n", - "#23 14.38 Uninstalling packaging-25.0:\n", - "#23 14.40 Successfully uninstalled packaging-25.0\n", - "#23 19.15 Successfully installed aiohappyeyeballs-2.6.1 aiohttp-3.11.18 aiosignal-1.3.2 async-timeout-5.0.1 attrs-25.3.0 brotli-1.1.0 certifi-2025.1.31 charset-normalizer-3.4.1 click-8.1.8 cloudpickle-3.1.1 colorama-0.4.6 cuda-bindings-12.8.0 cuda-python-12.8.0 cupy-cuda12x-13.4.1 fastrlock-0.8.3 frozenlist-1.6.0 gevent-25.4.1 geventhttpclient-2.3.3 greenlet-3.2.1 grpcio-1.67.1 holoscan-3.1.0 holoscan-cli-3.1.0 idna-3.10 markdown-it-py-3.0.0 mdurl-0.1.2 monai-deploy-app-sdk-0.5.1+37.g96f7e31.dirty multidict-6.4.3 packaging-23.2 propcache-0.3.1 protobuf-5.29.4 psutil-6.1.1 pydantic-1.10.21 pygments-2.19.1 python-on-whales-0.60.1 python-rapidjson-1.20 pyyaml-6.0.2 requests-2.32.3 rich-14.0.0 shellingham-1.5.4 tqdm-4.67.1 tritonclient-2.56.0 typeguard-4.4.2 typer-0.15.2 urllib3-2.4.0 wheel-axle-runtime-0.0.6 yarl-1.20.0 zope.event-5.0 zope.interface-7.2\n", - "#23 DONE 22.0s\n", - "\n", - "#24 [release 15/19] COPY ./models /opt/holoscan/models\n", - "#24 DONE 0.3s\n", - "\n", - "#25 [release 16/19] COPY ./map/app.json /etc/holoscan/app.json\n", - "#25 DONE 0.1s\n", - "\n", - "#26 [release 17/19] COPY ./app.config /var/holoscan/app.yaml\n", - "#26 DONE 0.1s\n", - "\n", - "#27 [release 18/19] COPY ./map/pkg.json /etc/holoscan/pkg.json\n", - "#27 DONE 0.1s\n", - "\n", - "#28 [release 19/19] COPY ./app /opt/holoscan/app\n", - "#28 DONE 0.1s\n", - "\n", - "#29 exporting to docker image format\n", - "#29 exporting layers\n", - "#29 exporting layers 187.0s done\n", - "#29 exporting manifest sha256:cac1ac4d69726995d3c9e061377448492061d466def990799cc72e811e162e90 0.0s done\n", - "#29 exporting config sha256:aacceda07071b8e9c4e0b360fd0b819d987eef71230c11c95f76c3053bfbd861 0.0s done\n", - "#29 sending tarball\n", - "#29 ...\n", - "\n", - "#30 importing to docker\n", - "#30 loading layer 49b545b4149c 283B / 283B\n", - "#30 loading layer c44b5ca75fdc 65.54kB / 5.09MB\n", - "#30 loading layer 3370fbb67e83 557.06kB / 3.26GB\n", - "#30 loading layer 3370fbb67e83 210.01MB / 3.26GB 6.3s\n", - "#30 loading layer 3370fbb67e83 337.02MB / 3.26GB 12.5s\n", - "#30 loading layer 3370fbb67e83 550.37MB / 3.26GB 18.7s\n", - "#30 loading layer 3370fbb67e83 735.31MB / 3.26GB 22.8s\n", - "#30 loading layer 3370fbb67e83 963.15MB / 3.26GB 27.0s\n", - "#30 loading layer 3370fbb67e83 1.18GB / 3.26GB 31.0s\n", - "#30 loading layer 3370fbb67e83 1.33GB / 3.26GB 37.2s\n", - "#30 loading layer 3370fbb67e83 1.56GB / 3.26GB 41.3s\n", - "#30 loading layer 3370fbb67e83 1.75GB / 3.26GB 45.4s\n", - "#30 loading layer 3370fbb67e83 2.02GB / 3.26GB 49.4s\n", - "#30 loading layer 3370fbb67e83 2.19GB / 3.26GB 55.6s\n", - "#30 loading layer 3370fbb67e83 2.24GB / 3.26GB 62.9s\n", - "#30 loading layer 3370fbb67e83 2.36GB / 3.26GB 69.0s\n", - "#30 loading layer 3370fbb67e83 2.56GB / 3.26GB 73.1s\n", - "#30 loading layer 3370fbb67e83 2.75GB / 3.26GB 77.1s\n", - "#30 loading layer 3370fbb67e83 2.93GB / 3.26GB 83.3s\n", - "#30 loading layer 3370fbb67e83 3.10GB / 3.26GB 89.5s\n", - "#30 loading layer af8c5ba7bee3 32.77kB / 144.30kB\n", - "#30 loading layer 8f8123670c0a 557.06kB / 398.53MB\n", - "#30 loading layer 8f8123670c0a 197.20MB / 398.53MB 2.1s\n", - "#30 loading layer 8f8123670c0a 228.95MB / 398.53MB 4.1s\n", - "#30 loading layer 8f8123670c0a 270.73MB / 398.53MB 6.2s\n", - "#30 loading layer 8f8123670c0a 334.23MB / 398.53MB 8.2s\n", - "#30 loading layer 8f8123670c0a 368.21MB / 398.53MB 10.3s\n", - "#30 loading layer c277737c154f 196.61kB / 17.81MB\n", - "#30 loading layer 01f35eabeadd 493B / 493B\n", - "#30 loading layer 21a6f7132dd0 316B / 316B\n", - "#30 loading layer 22aecd36f9de 302B / 302B\n", - "#30 loading layer ab9d985fcc93 3.33kB / 3.33kB\n", - "#30 loading layer 8f8123670c0a 398.53MB / 398.53MB 13.6s done\n", - "#30 loading layer 49b545b4149c 283B / 283B 109.9s done\n", - "#30 loading layer c44b5ca75fdc 5.09MB / 5.09MB 109.9s done\n", - "#30 loading layer 3370fbb67e83 3.26GB / 3.26GB 109.2s done\n", - "#30 loading layer af8c5ba7bee3 144.30kB / 144.30kB 13.7s done\n", - "#30 loading layer c277737c154f 17.81MB / 17.81MB 1.1s done\n", - "#30 loading layer 01f35eabeadd 493B / 493B 0.7s done\n", - "#30 loading layer 21a6f7132dd0 316B / 316B 0.6s done\n", - "#30 loading layer 22aecd36f9de 302B / 302B 0.5s done\n", - "#30 loading layer ab9d985fcc93 3.33kB / 3.33kB 0.5s done\n", - "#30 DONE 109.9s\n", - "\n", - "#29 exporting to docker image format\n", - "#29 sending tarball 147.3s done\n", - "#29 DONE 334.4s\n", - "\n", - "#31 exporting cache to client directory\n", - "#31 preparing build cache for export\n", - "#31 writing layer sha256:000344a04deee760c0681e29294ee3f527b8299026aef2cfc3fa93e327c63df7\n", - "#31 writing layer sha256:000344a04deee760c0681e29294ee3f527b8299026aef2cfc3fa93e327c63df7 0.1s done\n", - "#31 writing layer sha256:048e6a80d9e1847dcc9526191c8d16c8bdda32e8440cb0e287ba48983787b2ea 0.0s done\n", - "#31 writing layer sha256:1a0d52c93099897b518eb6cc6cd0fa3d52ff733e8606b4d8c92675ba9e7101ff done\n", - "#31 writing layer sha256:21ef12df128643f4e171d286035dc9c1a1e744f0ff52681473844fa3ebf148f9\n", - "#31 writing layer sha256:21ef12df128643f4e171d286035dc9c1a1e744f0ff52681473844fa3ebf148f9 51.1s done\n", - "#31 writing layer sha256:234b866f57e0c5d555af2d87a1857a17ec4ac7e70d2dc6c31ff0a072a4607f24\n", - "#31 writing layer sha256:234b866f57e0c5d555af2d87a1857a17ec4ac7e70d2dc6c31ff0a072a4607f24 done\n", - "#31 writing layer sha256:255905badeaa82f032e1043580eed8b745c19cd4a2cb7183883ee5a30f851d6d done\n", - "#31 writing layer sha256:3713021b02770a720dea9b54c03d0ed83e03a2ef5dce2898c56a327fee9a8bca done\n", - "#31 writing layer sha256:3a80776cdc9c9ef79bb38510849c9160f82462d346bf5a8bf29c811391b4e763 done\n", - "#31 writing layer sha256:46c9c54348df10b0d7700bf932d5de7dc5bf9ab91e685db7086e29e381ff8e12 done\n", - "#31 writing layer sha256:4984bf91ddd07bd551024b1b6bda153f7d4f5a5caf35d9e2ca01c95afb531638 0.0s done\n", - "#31 writing layer sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 done\n", - "#31 writing layer sha256:67b3546b211deefd67122e680c0932886e0b3c6bd6ae0665e3ab25d2d9f0cda0 done\n", - "#31 writing layer sha256:76cf1f2adf6fbbaa3d9ff2c120fc0ccf97b4b5388ee0a0dee82f894ea811caf8 0.1s done\n", - "#31 writing layer sha256:8a18a20487f64bf7fe1ac7ead38280d387b11f3d714179e19b4ecfba68a09f93\n", - "#31 writing layer sha256:8a18a20487f64bf7fe1ac7ead38280d387b11f3d714179e19b4ecfba68a09f93 0.0s done\n", - "#31 writing layer sha256:935b4cb3480886ca00a46c28cd98797870cfc7389818c85cd243869f4548fda4 done\n", - "#31 writing layer sha256:95dbda2f5f8116a35367b28d397faae7d34bd4a713aefe01ccfe5e326b0b0250 done\n", - "#31 writing layer sha256:980c13e156f90218b216bc6b0430472bbda71c0202804d350c0e16ef02075885 done\n", - "#31 writing layer sha256:9897f28322ebd7b633908503d8877b342e03a47293fcacdc8206b2e5d9f20923\n", - "#31 writing layer sha256:9897f28322ebd7b633908503d8877b342e03a47293fcacdc8206b2e5d9f20923 0.4s done\n", - "#31 writing layer sha256:ac52600be001236a2c291a4c5902c915bf5ec9d2441c06d2a54c587b76345847\n", - "#31 writing layer sha256:ac52600be001236a2c291a4c5902c915bf5ec9d2441c06d2a54c587b76345847 done\n", - "#31 writing layer sha256:b0436fe850f9a3fce99cc083d570eb3393b83444edf2dc04800a8e4d050d2d83 0.0s done\n", - "#31 writing layer sha256:bc25d810fc1fd99656c1b07d422e88cdb896508730175bc3ec187b79f3787044 done\n", - "#31 writing layer sha256:d0b9db5eaf93e490f07bab8abb1ac5475febcf822c25f2e1d1c82ff4273a7d0d done\n", - "#31 writing layer sha256:d339273dfb7fc3b7fd896d3610d360ab9a09ab33a818093cb73b4be7639b6e99 done\n", - "#31 writing layer sha256:da44fb0aa6d6f7c651c7eec8e11510c9c048b066b2ba36b261cefea12ff5ee3e done\n", - "#31 writing layer sha256:efc9014e2a4cb1e133b80bb4f047e9141e98685eb95b8d2471a8e35b86643e31 done\n", - "#31 writing layer sha256:f1e6c0e7271e4ce12dd1113858066e0d41d50b338596aea2c15a21da034a7d3d 0.0s done\n", - "#31 writing layer sha256:f3af93a430a247328c59fb2228f6fa43a0ce742b03464db94acf7c45311e31cd done\n", - "#31 writing layer sha256:ff7fc9bdba2b206dc4eb678f49b36a99daf566bf71753dc2cec30a0195f7a41a\n", - "#31 writing layer sha256:ff7fc9bdba2b206dc4eb678f49b36a99daf566bf71753dc2cec30a0195f7a41a 6.8s done\n", - "#31 preparing build cache for export 58.8s done\n", - "#31 writing config sha256:1401476261a3e0a96b4b64a3270960c3fa51a70d62e0cd7a30991c3da24af97e 0.0s done\n", - "#31 writing cache manifest sha256:b4e7496beec087df8709332743a34f2f69a9993f4fdf0ac0d1871c03d8664448 0.0s done\n", - "#31 DONE 58.8s\n", - "[2025-04-22 10:27:40,090] [INFO] (packager) - Build Summary:\n", - "\n", - "Platform: x64-workstation/dgpu\n", - " Status: Succeeded\n", - " Docker Tag: my_app-x64-workstation-dgpu-linux-amd64:1.0\n", - " Tarball: None\n" - ] - } - ], - "source": [ - "tag_prefix = \"my_app\"\n", - "\n", - "!monai-deploy package my_app -m {models_folder} -c my_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the MAP Docker image is created" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Application class\n", + "\n", + "Our application class would look like below.\n", + "\n", + "It defines `App` class, inheriting the base `Application` class.\n", + "\n", + "Objects required for DICOM parsing, series selection, pixel data conversion to volume image, model specific inference, and the AI result specific DICOM Segmentation object writers are created. The execution pipeline, as a Directed Acyclic Graph, is then constructed by connecting these objects through `self.add_flow()`." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "my_app-x64-workstation-dgpu-linux-amd64 1.0 aacceda07071 6 minutes ago 9.25GB\n" - ] - } - ], - "source": [ - "!docker image ls | grep {tag_prefix}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can choose to display and inspect the MAP manifests by running the container with the `show` command.\n", - "Furthermore, we can also extract the manifests and other contents in the MAP by using the `extract` command while mapping specific folder to the host's (we know that our MAP is compliant and supports these commands).\n", - "\n", - ":::{note}\n", - "The host folder for storing the extracted content must first be created by the user, and if it has been created by Docker on running the container, the folder needs to be deleted and re-created.\n", - ":::" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class AISpleenSegApp(Application):\n", + " \"\"\"Demonstrates inference with built-in MONAI Bundle inference operator with DICOM files as input/output\n", + "\n", + " This application loads a set of DICOM instances, select the appropriate series, converts the series to\n", + " 3D volume image, performs inference with the built-in MONAI Bundle inference operator, including pre-processing\n", + " and post-processing, save the segmentation image in a DICOM Seg OID in an instance file, and optionally the\n", + " surface mesh in STL format.\n", + "\n", + " Pertinent MONAI Bundle:\n", + " https://github.com/Project-MONAI/model-zoo/tree/dev/models/spleen_ct_segmentation\n", + "\n", + " Execution Time Estimate:\n", + " With a Nvidia GV100 32GB GPU, for an input DICOM Series of 515 instances, the execution time is around\n", + " 25 seconds with saving both DICOM Seg and surface mesh STL file, and 15 seconds with DICOM Seg only.\n", + " \"\"\"\n", + "\n", + " def __init__(self, *args, **kwargs):\n", + " \"\"\"Creates an application instance.\"\"\"\n", + " self._logger = logging.getLogger(\"{}.{}\".format(__name__, type(self).__name__))\n", + " super().__init__(*args, **kwargs)\n", + "\n", + " def run(self, *args, **kwargs):\n", + " # This method calls the base class to run. Can be omitted if simply calling through.\n", + " self._logger.info(f\"Begin {self.run.__name__}\")\n", + " super().run(*args, **kwargs)\n", + " self._logger.info(f\"End {self.run.__name__}\")\n", + "\n", + " def compose(self):\n", + " \"\"\"Creates the app specific operators and chain them up in the processing DAG.\"\"\"\n", + "\n", + " logging.info(f\"Begin {self.compose.__name__}\")\n", + "\n", + " app_context = Application.init_app_context({}) # Do not pass argv in Jupyter Notebook\n", + " app_input_path = Path(app_context.input_path)\n", + " app_output_path = Path(app_context.output_path)\n", + " model_path = Path(app_context.model_path)\n", + "\n", + " # Create the custom operator(s) as well as SDK built-in operator(s).\n", + " study_loader_op = DICOMDataLoaderOperator(\n", + " self, CountCondition(self, 1), input_folder=app_input_path, name=\"study_loader_op\"\n", + " )\n", + " series_selector_op = DICOMSeriesSelectorOperator(self, rules=Sample_Rules_Text, name=\"series_selector_op\")\n", + " series_to_vol_op = DICOMSeriesToVolumeOperator(self, name=\"series_to_vol_op\")\n", + "\n", + " # Create the inference operator that supports MONAI Bundle and automates the inference.\n", + " # The IOMapping labels match the input and prediction keys in the pre and post processing.\n", + " # The model_name is optional when the app has only one model.\n", + " # The bundle_path argument optionally can be set to an accessible bundle file path in the dev\n", + " # environment, so when the app is packaged into a MAP, the operator can complete the bundle parsing\n", + " # during init.\n", + "\n", + " config_names = BundleConfigNames(config_names=[\"inference\"]) # Same as the default\n", + "\n", + " bundle_spleen_seg_op = MonaiBundleInferenceOperator(\n", + " self,\n", + " input_mapping=[IOMapping(\"image\", Image, IOType.IN_MEMORY)],\n", + " output_mapping=[IOMapping(\"pred\", Image, IOType.IN_MEMORY)],\n", + " app_context=app_context,\n", + " bundle_config_names=config_names,\n", + " bundle_path=model_path,\n", + " name=\"bundle_spleen_seg_op\",\n", + " )\n", + "\n", + " # Create DICOM Seg writer providing the required segment description for each segment with\n", + " # the actual algorithm and the pertinent organ/tissue. The segment_label, algorithm_name,\n", + " # and algorithm_version are of DICOM VR LO type, limited to 64 chars.\n", + " # https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_6.2.html\n", + " segment_descriptions = [\n", + " SegmentDescription(\n", + " segment_label=\"Spleen\",\n", + " segmented_property_category=codes.SCT.Organ,\n", + " segmented_property_type=codes.SCT.Spleen,\n", + " algorithm_name=\"volumetric (3D) segmentation of the spleen from CT image\",\n", + " algorithm_family=codes.DCM.ArtificialIntelligence,\n", + " algorithm_version=\"0.3.2\",\n", + " )\n", + " ]\n", + "\n", + " custom_tags = {\"SeriesDescription\": \"AI generated Seg, not for clinical use.\"}\n", + "\n", + " dicom_seg_writer = DICOMSegmentationWriterOperator(\n", + " self,\n", + " segment_descriptions=segment_descriptions,\n", + " custom_tags=custom_tags,\n", + " output_folder=app_output_path,\n", + " name=\"dicom_seg_writer\",\n", + " )\n", + "\n", + " # Create the processing pipeline, by specifying the source and destination operators, and\n", + " # ensuring the output from the former matches the input of the latter, in both name and type.\n", + " self.add_flow(study_loader_op, series_selector_op, {(\"dicom_study_list\", \"dicom_study_list\")})\n", + " self.add_flow(\n", + " series_selector_op, series_to_vol_op, {(\"study_selected_series_list\", \"study_selected_series_list\")}\n", + " )\n", + " self.add_flow(series_to_vol_op, bundle_spleen_seg_op, {(\"image\", \"image\")})\n", + " # Note below the dicom_seg_writer requires two inputs, each coming from a source operator.\n", + " self.add_flow(\n", + " series_selector_op, dicom_seg_writer, {(\"study_selected_series_list\", \"study_selected_series_list\")}\n", + " )\n", + " self.add_flow(bundle_spleen_seg_op, dicom_seg_writer, {(\"pred\", \"seg_image\")})\n", + " # Create the surface mesh STL conversion operator and add it to the app execution flow, if needed, by\n", + " # uncommenting the following couple lines.\n", + " stl_conversion_op = STLConversionOperator(\n", + " self, output_file=app_output_path.joinpath(\"stl/spleen.stl\"), name=\"stl_conversion_op\"\n", + " )\n", + " self.add_flow(bundle_spleen_seg_op, stl_conversion_op, {(\"pred\", \"image\")})\n", + "\n", + " logging.info(f\"End {self.compose.__name__}\")\n", + "\n", + "\n", + "# This is a sample series selection rule in JSON, simply selecting CT series.\n", + "# If the study has more than 1 CT series, then all of them will be selected.\n", + "# Please see more detail in DICOMSeriesSelectorOperator.\n", + "Sample_Rules_Text = \"\"\"\n", + "{\n", + " \"selections\": [\n", + " {\n", + " \"name\": \"CT Series\",\n", + " \"conditions\": {\n", + " \"StudyDescription\": \"(.*?)\",\n", + " \"Modality\": \"(?i)CT\",\n", + " \"SeriesDescription\": \"(.*?)\"\n", + " }\n", + " }\n", + " ]\n", + "}\n", + "\"\"\"" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Display manifests and extract MAP contents to the host folder, ./export\n", - "\n", - "============================== app.json ==============================\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"command\": \"[\\\"python3\\\", \\\"/opt/holoscan/app\\\"]\",\n", - " \"environment\": {\n", - " \"HOLOSCAN_APPLICATION\": \"/opt/holoscan/app\",\n", - " \"HOLOSCAN_INPUT_PATH\": \"input/\",\n", - " \"HOLOSCAN_OUTPUT_PATH\": \"output/\",\n", - " \"HOLOSCAN_WORKDIR\": \"/var/holoscan\",\n", - " \"HOLOSCAN_MODEL_PATH\": \"/opt/holoscan/models\",\n", - " \"HOLOSCAN_CONFIG_PATH\": \"/var/holoscan/app.yaml\",\n", - " \"HOLOSCAN_APP_MANIFEST_PATH\": \"/etc/holoscan/app.json\",\n", - " \"HOLOSCAN_PKG_MANIFEST_PATH\": \"/etc/holoscan/pkg.json\",\n", - " \"HOLOSCAN_DOCS_PATH\": \"/opt/holoscan/docs\",\n", - " \"HOLOSCAN_LOGS_PATH\": \"/var/holoscan/logs\"\n", - " },\n", - " \"input\": {\n", - " \"path\": \"input/\",\n", - " \"formats\": null\n", - " },\n", - " \"liveness\": null,\n", - " \"output\": {\n", - " \"path\": \"output/\",\n", - " \"formats\": null\n", - " },\n", - " \"readiness\": null,\n", - " \"sdk\": \"monai-deploy\",\n", - " \"sdkVersion\": \"0.5.1\",\n", - " \"timeout\": 0,\n", - " \"version\": 1,\n", - " \"workingDirectory\": \"/var/holoscan\"\n", - "}\n", - "\n", - "============================== pkg.json ==============================\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"applicationRoot\": \"/opt/holoscan/app\",\n", - " \"modelRoot\": \"/opt/holoscan/models\",\n", - " \"models\": {\n", - " \"model\": \"/opt/holoscan/models/model\"\n", - " },\n", - " \"resources\": {\n", - " \"cpu\": 1,\n", - " \"gpu\": 1,\n", - " \"memory\": \"1Gi\",\n", - " \"gpuMemory\": \"6Gi\"\n", - " },\n", - " \"version\": 1,\n", - " \"platformConfig\": \"dgpu\"\n", - "}\n", - "\n", - "2025-04-22 17:27:43 [INFO] Copying application from /opt/holoscan/app to /var/run/holoscan/export/app\n", - "\n", - "2025-04-22 17:27:43 [INFO] Copying application manifest file from /etc/holoscan/app.json to /var/run/holoscan/export/config/app.json\n", - "2025-04-22 17:27:43 [INFO] Copying pkg manifest file from /etc/holoscan/pkg.json to /var/run/holoscan/export/config/pkg.json\n", - "2025-04-22 17:27:43 [INFO] Copying application configuration from /var/holoscan/app.yaml to /var/run/holoscan/export/config/app.yaml\n", - "\n", - "2025-04-22 17:27:43 [INFO] Copying models from /opt/holoscan/models to /var/run/holoscan/export/models\n", - "\n", - "2025-04-22 17:27:43 [INFO] Copying documentation from /opt/holoscan/docs/ to /var/run/holoscan/export/docs\n", - "2025-04-22 17:27:43 [INFO] '/opt/holoscan/docs/' cannot be found.\n", - "\n", - "app config models\n" - ] - } - ], - "source": [ - "!echo \"Display manifests and extract MAP contents to the host folder, ./export\"\n", - "!docker run --rm {tag_prefix}-x64-workstation-dgpu-linux-amd64:1.0 show\n", - "!rm -rf `pwd`/export && mkdir -p `pwd`/export\n", - "!docker run --rm -v `pwd`/export/:/var/run/holoscan/export/ {tag_prefix}-x64-workstation-dgpu-linux-amd64:1.0 extract\n", - "!ls `pwd`/export" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Executing packaged app locally\n", - "\n", - "The packaged app can be run locally through [MONAI Application Runner](/developing_with_sdk/executing_packaged_app_locally)." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Executing app locally\n", + "\n", + "We can execute the app in the Jupyter notebook. Note that the DICOM files of the CT Abdomen series must be present in the `dcm` folder and the Torch Script model, `model.ts`, also in the folder as pointed to by the environment variables." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2025-04-22 10:27:44,899] [INFO] (runner) - Checking dependencies...\n", - "[2025-04-22 10:27:44,899] [INFO] (runner) - --> Verifying if \"docker\" is installed...\n", - "\n", - "[2025-04-22 10:27:44,899] [INFO] (runner) - --> Verifying if \"docker-buildx\" is installed...\n", - "\n", - "[2025-04-22 10:27:44,900] [INFO] (runner) - --> Verifying if \"my_app-x64-workstation-dgpu-linux-amd64:1.0\" is available...\n", - "\n", - "[2025-04-22 10:27:44,977] [INFO] (runner) - Reading HAP/MAP manifest...\n", - "Successfully copied 2.56kB to /tmp/tmpmnebv7ra/app.json\n", - "Successfully copied 2.05kB to /tmp/tmpmnebv7ra/pkg.json\n", - "bb0cf20f8662e86bcda22ed7a5faae90e0b66cdd38d6f64a8e2ceb4e95a0ebca\n", - "[2025-04-22 10:27:45,406] [INFO] (runner) - --> Verifying if \"nvidia-ctk\" is installed...\n", - "\n", - "[2025-04-22 10:27:45,407] [INFO] (runner) - --> Verifying \"nvidia-ctk\" version...\n", - "\n", - "[2025-04-22 10:27:45,714] [INFO] (common) - Launching container (21c6001bf0ef) using image 'my_app-x64-workstation-dgpu-linux-amd64:1.0'...\n", - " container name: youthful_jepsen\n", - " host name: mingq-dt\n", - " network: host\n", - " user: 1000:1000\n", - " ulimits: memlock=-1:-1, stack=67108864:67108864\n", - " cap_add: CAP_SYS_PTRACE\n", - " ipc mode: host\n", - " shared memory size: 67108864\n", - " devices: \n", - " group_add: 44\n", - "2025-04-22 17:27:46 [INFO] Launching application python3 /opt/holoscan/app ...\n", - "\n", - "[info] [fragment.cpp:705] Loading extensions from configs...\n", - "\n", - "[info] [gxf_executor.cpp:265] Creating context\n", - "\n", - "[2025-04-22 17:27:53,854] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=['/opt/holoscan/app'])\n", - "\n", - "[2025-04-22 17:27:53,858] [INFO] (root) - AppContext object: AppContext(input_path=/var/holoscan/input, output_path=/var/holoscan/output, model_path=/opt/holoscan/models, workdir=/var/holoscan), triton_server_netloc=\n", - "\n", - "[2025-04-22 17:27:53,860] [INFO] (root) - End compose\n", - "\n", - "[info] [gxf_executor.cpp:2396] Activating Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2426] Running Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2428] Waiting for completion...\n", - "\n", - "[info] [greedy_scheduler.cpp:191] Scheduling 6 entities\n", - "\n", - "[2025-04-22 17:27:53,886] [INFO] (monai.deploy.operators.dicom_data_loader_operator.DICOMDataLoaderOperator) - No or invalid input path from the optional input port: None\n", - "\n", - "[2025-04-22 17:27:54,799] [INFO] (root) - Finding series for Selection named: CT Series\n", - "\n", - "[2025-04-22 17:27:54,799] [INFO] (root) - Searching study, : 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291\n", - "\n", - " # of series: 1\n", - "\n", - "[2025-04-22 17:27:54,799] [INFO] (root) - Working on series, instance UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "\n", - "[2025-04-22 17:27:54,799] [INFO] (root) - On attribute: 'StudyDescription' to match value: '(.*?)'\n", - "\n", - "[2025-04-22 17:27:54,800] [INFO] (root) - Series attribute StudyDescription value: CT ABDOMEN W IV CONTRAST\n", - "\n", - "[2025-04-22 17:27:54,800] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "\n", - "[2025-04-22 17:27:54,800] [INFO] (root) - On attribute: 'Modality' to match value: '(?i)CT'\n", - "\n", - "[2025-04-22 17:27:54,800] [INFO] (root) - Series attribute Modality value: CT\n", - "\n", - "[2025-04-22 17:27:54,800] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "\n", - "[2025-04-22 17:27:54,800] [INFO] (root) - On attribute: 'SeriesDescription' to match value: '(.*?)'\n", - "\n", - "[2025-04-22 17:27:54,800] [INFO] (root) - Series attribute SeriesDescription value: ABD/PANC 3.0 B31f\n", - "\n", - "[2025-04-22 17:27:54,800] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "\n", - "[2025-04-22 17:27:54,800] [INFO] (root) - Selected Series, UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "\n", - "[2025-04-22 17:27:54,800] [INFO] (root) - Series Selection finalized.\n", - "\n", - "[2025-04-22 17:27:54,800] [INFO] (root) - Series Description of selected DICOM Series for inference: ABD/PANC 3.0 B31f\n", - "\n", - "[2025-04-22 17:27:54,800] [INFO] (root) - Series Instance UID of selected DICOM Series for inference: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "\n", - "[2025-04-22 17:27:55,081] [INFO] (root) - Casting to float32\n", - "\n", - "[2025-04-22 17:27:55,383] [INFO] (root) - Parsing from bundle_path: /opt/holoscan/models/model/model.ts\n", - "\n", - "/home/holoscan/.local/lib/python3.10/site-packages/monai/bundle/reference_resolver.py:216: UserWarning: Detected deprecated name 'optional_packages_version' in configuration file, replacing with 'required_packages_version'.\n", - "\n", - " warnings.warn(\n", - "\n", - "[2025-04-22 17:27:59,716] [INFO] (monai.deploy.operators.stl_conversion_operator.STLConversionOperator) - Output will be saved in file /var/holoscan/output/stl/spleen.stl.\n", - "\n", - "[2025-04-22 17:28:01,195] [INFO] (monai.deploy.operators.stl_conversion_operator.SpatialImage) - 3D image\n", - "\n", - "[2025-04-22 17:28:01,196] [INFO] (monai.deploy.operators.stl_conversion_operator.STLConverter) - Image ndarray shape:(204, 512, 512)\n", - "\n", - "/home/holoscan/.local/lib/python3.10/site-packages/highdicom/base.py:163: UserWarning: The string \"C3N-00198\" is unlikely to represent the intended person name since it contains only a single component. Construct a person name according to the format in described in https://dicom.nema.org/dicom/2013/output/chtml/part05/sect_6.2.html#sect_6.2.1.2, or, in pydicom 2.2.0 or later, use the pydicom.valuerep.PersonName.from_named_components() method to construct the person name correctly. If a single-component name is really intended, add a trailing caret character to disambiguate the name.\n", - "\n", - " check_person_name(patient_name)\n", - "\n", - "[2025-04-22 17:28:12,576] [INFO] (highdicom.base) - copy Image-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "\n", - "[2025-04-22 17:28:12,576] [INFO] (highdicom.base) - copy attributes of module \"Specimen\"\n", - "\n", - "[2025-04-22 17:28:12,576] [INFO] (highdicom.base) - copy Patient-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "\n", - "[2025-04-22 17:28:12,576] [INFO] (highdicom.base) - copy attributes of module \"Patient\"\n", - "\n", - "[2025-04-22 17:28:12,577] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Subject\"\n", - "\n", - "[2025-04-22 17:28:12,577] [INFO] (highdicom.base) - copy Study-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "\n", - "[2025-04-22 17:28:12,577] [INFO] (highdicom.base) - copy attributes of module \"General Study\"\n", - "\n", - "[2025-04-22 17:28:12,577] [INFO] (highdicom.base) - copy attributes of module \"Patient Study\"\n", - "\n", - "[2025-04-22 17:28:12,578] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Study\"\n", - "\n", - "[info] [greedy_scheduler.cpp:372] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "\n", - "[info] [greedy_scheduler.cpp:401] Scheduler finished.\n", - "\n", - "[info] [gxf_executor.cpp:2431] Deactivating Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2439] Graph execution finished.\n", - "\n", - "[2025-04-22 17:28:12,698] [INFO] (app.AISpleenSegApp) - End run\n", - "\n", - "[2025-04-22 10:28:14,349] [INFO] (common) - Container 'youthful_jepsen'(21c6001bf0ef) exited.\n" - ] - } - ], - "source": [ - "# Clear the output folder and run the MAP. The input is expected to be a folder.\n", - "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", - "!monai-deploy run -i $HOLOSCAN_INPUT_PATH -o $HOLOSCAN_OUTPUT_PATH my_app-x64-workstation-dgpu-linux-amd64:1.0" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", + "logging.info(f\"Begin {__name__}\")\n", + "AISpleenSegApp().run()\n", + "logging.info(f\"End {__name__}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the application is verified inside Jupyter notebook, we can write the above Python code into Python files in an application folder.\n", + "\n", + "The application folder structure would look like below:\n", + "\n", + "```bash\n", + "my_app\n", + "├── __main__.py\n", + "└── app.py\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create an application folder\n", + "!mkdir -p my_app && rm -rf my_app/*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### app.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile my_app/app.py\n", + "\n", + "# Copyright 2021-2023 MONAI Consortium\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "\n", + "import logging\n", + "from pathlib import Path\n", + "\n", + "# Required for setting SegmentDescription attributes. Direct import as this is not part of App SDK package.\n", + "from pydicom.sr.codedict import codes\n", + "\n", + "from monai.deploy.conditions import CountCondition\n", + "from monai.deploy.core import AppContext, Application\n", + "from monai.deploy.core.domain import Image\n", + "from monai.deploy.core.io_type import IOType\n", + "from monai.deploy.operators.dicom_data_loader_operator import DICOMDataLoaderOperator\n", + "from monai.deploy.operators.dicom_seg_writer_operator import DICOMSegmentationWriterOperator, SegmentDescription\n", + "from monai.deploy.operators.dicom_series_selector_operator import DICOMSeriesSelectorOperator\n", + "from monai.deploy.operators.dicom_series_to_volume_operator import DICOMSeriesToVolumeOperator\n", + "from monai.deploy.operators.monai_bundle_inference_operator import (\n", + " BundleConfigNames,\n", + " IOMapping,\n", + " MonaiBundleInferenceOperator,\n", + ")\n", + "from monai.deploy.operators.stl_conversion_operator import STLConversionOperator\n", + "\n", + "\n", + "class AISpleenSegApp(Application):\n", + " \"\"\"Demonstrates inference with built-in MONAI Bundle inference operator with DICOM files as input/output\n", + "\n", + " This application loads a set of DICOM instances, select the appropriate series, converts the series to\n", + " 3D volume image, performs inference with the built-in MONAI Bundle inference operator, including pre-processing\n", + " and post-processing, save the segmentation image in a DICOM Seg OID in an instance file, and optionally the\n", + " surface mesh in STL format.\n", + "\n", + " Pertinent MONAI Bundle:\n", + " https://github.com/Project-MONAI/model-zoo/tree/dev/models/spleen_ct_segmentation\n", + "\n", + " Execution Time Estimate:\n", + " With a Nvidia GV100 32GB GPU, for an input DICOM Series of 515 instances, the execution time is around\n", + " 25 seconds with saving both DICOM Seg and surface mesh STL file, and 15 seconds with DICOM Seg only.\n", + " \"\"\"\n", + "\n", + " def __init__(self, *args, **kwargs):\n", + " \"\"\"Creates an application instance.\"\"\"\n", + " self._logger = logging.getLogger(\"{}.{}\".format(__name__, type(self).__name__))\n", + " super().__init__(*args, **kwargs)\n", + "\n", + " def run(self, *args, **kwargs):\n", + " # This method calls the base class to run. Can be omitted if simply calling through.\n", + " self._logger.info(f\"Begin {self.run.__name__}\")\n", + " super().run(*args, **kwargs)\n", + " self._logger.info(f\"End {self.run.__name__}\")\n", + "\n", + " def compose(self):\n", + " \"\"\"Creates the app specific operators and chain them up in the processing DAG.\"\"\"\n", + "\n", + " logging.info(f\"Begin {self.compose.__name__}\")\n", + "\n", + " # Use Commandline options over environment variables to init context.\n", + " app_context = Application.init_app_context(self.argv)\n", + " app_input_path = Path(app_context.input_path)\n", + " app_output_path = Path(app_context.output_path)\n", + " model_path = Path(app_context.model_path)\n", + "\n", + " # Create the custom operator(s) as well as SDK built-in operator(s).\n", + " study_loader_op = DICOMDataLoaderOperator(\n", + " self, CountCondition(self, 1), input_folder=app_input_path, name=\"study_loader_op\"\n", + " )\n", + " series_selector_op = DICOMSeriesSelectorOperator(self, rules=Sample_Rules_Text, name=\"series_selector_op\")\n", + " series_to_vol_op = DICOMSeriesToVolumeOperator(self, name=\"series_to_vol_op\")\n", + "\n", + " # Create the inference operator that supports MONAI Bundle and automates the inference.\n", + " # The IOMapping labels match the input and prediction keys in the pre and post processing.\n", + " # The model_name is optional when the app has only one model.\n", + " # The bundle_path argument optionally can be set to an accessible bundle file path in the dev\n", + " # environment, so when the app is packaged into a MAP, the operator can complete the bundle parsing\n", + " # during init.\n", + "\n", + " config_names = BundleConfigNames(config_names=[\"inference\"]) # Same as the default\n", + "\n", + " bundle_spleen_seg_op = MonaiBundleInferenceOperator(\n", + " self,\n", + " input_mapping=[IOMapping(\"image\", Image, IOType.IN_MEMORY)],\n", + " output_mapping=[IOMapping(\"pred\", Image, IOType.IN_MEMORY)],\n", + " app_context=app_context,\n", + " bundle_config_names=config_names,\n", + " bundle_path=model_path,\n", + " name=\"bundle_spleen_seg_op\",\n", + " )\n", + "\n", + " # Create DICOM Seg writer providing the required segment description for each segment with\n", + " # the actual algorithm and the pertinent organ/tissue. The segment_label, algorithm_name,\n", + " # and algorithm_version are of DICOM VR LO type, limited to 64 chars.\n", + " # https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_6.2.html\n", + " segment_descriptions = [\n", + " SegmentDescription(\n", + " segment_label=\"Spleen\",\n", + " segmented_property_category=codes.SCT.Organ,\n", + " segmented_property_type=codes.SCT.Spleen,\n", + " algorithm_name=\"volumetric (3D) segmentation of the spleen from CT image\",\n", + " algorithm_family=codes.DCM.ArtificialIntelligence,\n", + " algorithm_version=\"0.3.2\",\n", + " )\n", + " ]\n", + "\n", + " custom_tags = {\"SeriesDescription\": \"AI generated Seg, not for clinical use.\"}\n", + "\n", + " dicom_seg_writer = DICOMSegmentationWriterOperator(\n", + " self,\n", + " segment_descriptions=segment_descriptions,\n", + " custom_tags=custom_tags,\n", + " output_folder=app_output_path,\n", + " name=\"dicom_seg_writer\",\n", + " )\n", + "\n", + " # Create the processing pipeline, by specifying the source and destination operators, and\n", + " # ensuring the output from the former matches the input of the latter, in both name and type.\n", + " self.add_flow(study_loader_op, series_selector_op, {(\"dicom_study_list\", \"dicom_study_list\")})\n", + " self.add_flow(\n", + " series_selector_op, series_to_vol_op, {(\"study_selected_series_list\", \"study_selected_series_list\")}\n", + " )\n", + " self.add_flow(series_to_vol_op, bundle_spleen_seg_op, {(\"image\", \"image\")})\n", + " # Note below the dicom_seg_writer requires two inputs, each coming from a source operator.\n", + " self.add_flow(\n", + " series_selector_op, dicom_seg_writer, {(\"study_selected_series_list\", \"study_selected_series_list\")}\n", + " )\n", + " self.add_flow(bundle_spleen_seg_op, dicom_seg_writer, {(\"pred\", \"seg_image\")})\n", + " # Create the surface mesh STL conversion operator and add it to the app execution flow, if needed, by\n", + " # uncommenting the following couple lines.\n", + " stl_conversion_op = STLConversionOperator(\n", + " self, output_file=app_output_path.joinpath(\"stl/spleen.stl\"), name=\"stl_conversion_op\"\n", + " )\n", + " self.add_flow(bundle_spleen_seg_op, stl_conversion_op, {(\"pred\", \"image\")})\n", + "\n", + " logging.info(f\"End {self.compose.__name__}\")\n", + "\n", + "\n", + "# This is a sample series selection rule in JSON, simply selecting CT series.\n", + "# If the study has more than 1 CT series, then all of them will be selected.\n", + "# Please see more detail in DICOMSeriesSelectorOperator.\n", + "Sample_Rules_Text = \"\"\"\n", + "{\n", + " \"selections\": [\n", + " {\n", + " \"name\": \"CT Series\",\n", + " \"conditions\": {\n", + " \"StudyDescription\": \"(.*?)\",\n", + " \"Modality\": \"(?i)CT\",\n", + " \"SeriesDescription\": \"(.*?)\"\n", + " }\n", + " }\n", + " ]\n", + "}\n", + "\"\"\"\n", + "\n", + "if __name__ == \"__main__\":\n", + " AISpleenSegApp().run()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```python\n", + "if __name__ == \"__main__\":\n", + " AISpleenSegApp().run()\n", + "```\n", + "\n", + "The above lines are needed to execute the application code by using `python` interpreter.\n", + "\n", + "### \\_\\_main\\_\\_.py\n", + "\n", + "\\_\\_main\\_\\_.py is needed for MONAI Application Packager to detect the main application code (`app.py`) when the application is executed with the application folder path (e.g., `python simple_imaging_app`)." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.2.826.0.1.3680043.10.511.3.36310308785029269065941040056862019.dcm stl\n" - ] + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile my_app/__main__.py\n", + "from app import AISpleenSegApp\n", + "\n", + "if __name__ == \"__main__\":\n", + " AISpleenSegApp().run()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!ls my_app" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This time, let's execute the app in the command line.\n", + "\n", + ":::{note}\n", + "Since the environment variables have been set and contain the correct paths, it is not necessary to provide the command line options on running the application. The following command demonstrates the use of the options.\n", + ":::" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", + "!python my_app -i dcm -o output -m models" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!ls output" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Packaging app\n", + "\n", + "Let's package the app with [MONAI Application Packager](/developing_with_sdk/packaging_app).\n", + "\n", + "In this version of the App SDK, we need to write out the configuration yaml file as well as the package requirements file, in the application folder." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile my_app/app.yaml\n", + "%YAML 1.2\n", + "---\n", + "application:\n", + " title: MONAI Deploy App Package - MONAI Bundle AI App\n", + " version: 1.0\n", + " inputFormats: [\"file\"]\n", + " outputFormats: [\"file\"]\n", + "\n", + "resources:\n", + " cpu: 1\n", + " gpu: 1\n", + " memory: 1Gi\n", + " gpuMemory: 6Gi" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile my_app/requirements.txt\n", + "highdicom>=0.18.2\n", + "monai>=1.0\n", + "nibabel>=3.2.1\n", + "numpy>=1.21.6\n", + "pydicom>=2.3.0\n", + "setuptools>=59.5.0 # for pkg_resources\n", + "SimpleITK>=2.0.0\n", + "scikit-image>=0.17.2\n", + "numpy-stl>=2.12.0\n", + "trimesh>=3.8.11\n", + "torch>=1.12.0\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use the CLI package command to build the MONAI Application Package (MAP) container image based on a supported base image.\n", + "\n", + ":::{note}\n", + "Building a MONAI Application Package (Docker image) can take time. Use `-l DEBUG` option to see the progress.\n", + ":::" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tag_prefix = \"my_app\"\n", + "\n", + "# holoscan-cli downloads packaging manifests from GitHub; use the release tag URL\n", + "# because the files are not kept on the main branch.\n", + "import holoscan_cli\n", + "\n", + "cli_version = holoscan_cli.__version__\n", + "manifest_url = (\n", + " f\"https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/\"\n", + " f\"v{cli_version}/releases/{cli_version}/artifacts-cu12.json\"\n", + ")\n", + "\n", + "!monai-deploy package my_app -m {models_folder} -c my_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12 --source {manifest_url}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the MAP Docker image is created" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!docker image ls | grep {tag_prefix}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can choose to display and inspect the MAP manifests by running the container with the `show` command.\n", + "Furthermore, we can also extract the manifests and other contents in the MAP by using the `extract` command while mapping specific folder to the host's (we know that our MAP is compliant and supports these commands).\n", + "\n", + ":::{note}\n", + "The host folder for storing the extracted content must first be created by the user, and if it has been created by Docker on running the container, the folder needs to be deleted and re-created.\n", + ":::" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!echo \"Display manifests and extract MAP contents to the host folder, ./export\"\n", + "!docker run --rm {tag_prefix}-x64-workstation-dgpu-linux-amd64:1.0 show\n", + "!rm -rf `pwd`/export && mkdir -p `pwd`/export\n", + "!docker run --rm -v `pwd`/export/:/var/run/holoscan/export/ {tag_prefix}-x64-workstation-dgpu-linux-amd64:1.0 extract\n", + "!ls `pwd`/export" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Executing packaged app locally\n", + "\n", + "The packaged app can be run locally through [MONAI Application Runner](/developing_with_sdk/executing_packaged_app_locally)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Clear the output folder and run the MAP. The input is expected to be a folder.\n", + "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", + "!monai-deploy run -i $HOLOSCAN_INPUT_PATH -o $HOLOSCAN_OUTPUT_PATH my_app-x64-workstation-dgpu-linux-amd64:1.0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!ls $HOLOSCAN_OUTPUT_PATH" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" } - ], - "source": [ - "!ls $HOLOSCAN_OUTPUT_PATH" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 4 + "nbformat": 4, + "nbformat_minor": 4 } diff --git a/notebooks/tutorials/05_multi_model_app.ipynb b/notebooks/tutorials/05_multi_model_app.ipynb index 977126a8..e6d6f169 100644 --- a/notebooks/tutorials/05_multi_model_app.ipynb +++ b/notebooks/tutorials/05_multi_model_app.ipynb @@ -170,223 +170,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Archive: ai_multi_model_bundle_data.zip\n", - " inflating: dcm/1-001.dcm \n", - " inflating: dcm/1-002.dcm \n", - " inflating: dcm/1-003.dcm \n", - " inflating: dcm/1-004.dcm \n", - " inflating: dcm/1-005.dcm \n", - " inflating: dcm/1-006.dcm \n", - " inflating: dcm/1-007.dcm \n", - " inflating: dcm/1-008.dcm \n", - " inflating: dcm/1-009.dcm \n", - " inflating: dcm/1-010.dcm \n", - " inflating: dcm/1-011.dcm \n", - " inflating: dcm/1-012.dcm \n", - " inflating: dcm/1-013.dcm \n", - " inflating: dcm/1-014.dcm \n", - " inflating: dcm/1-015.dcm \n", - " inflating: dcm/1-016.dcm \n", - " inflating: dcm/1-017.dcm \n", - " inflating: dcm/1-018.dcm \n", - " inflating: dcm/1-019.dcm \n", - " inflating: dcm/1-020.dcm \n", - " inflating: dcm/1-021.dcm \n", - " inflating: dcm/1-022.dcm \n", - " inflating: dcm/1-023.dcm \n", - " inflating: dcm/1-024.dcm \n", - " inflating: dcm/1-025.dcm \n", - " inflating: dcm/1-026.dcm \n", - " inflating: dcm/1-027.dcm \n", - " inflating: dcm/1-028.dcm \n", - " inflating: dcm/1-029.dcm \n", - " inflating: dcm/1-030.dcm \n", - " inflating: dcm/1-031.dcm \n", - " inflating: dcm/1-032.dcm \n", - " inflating: dcm/1-033.dcm \n", - " inflating: dcm/1-034.dcm \n", - " inflating: dcm/1-035.dcm \n", - " inflating: dcm/1-036.dcm \n", - " inflating: dcm/1-037.dcm \n", - " inflating: dcm/1-038.dcm \n", - " inflating: dcm/1-039.dcm \n", - " inflating: dcm/1-040.dcm \n", - " inflating: dcm/1-041.dcm \n", - " inflating: dcm/1-042.dcm \n", - " inflating: dcm/1-043.dcm \n", - " inflating: dcm/1-044.dcm \n", - " inflating: dcm/1-045.dcm \n", - " inflating: dcm/1-046.dcm \n", - " inflating: dcm/1-047.dcm \n", - " inflating: dcm/1-048.dcm \n", - " inflating: dcm/1-049.dcm \n", - " inflating: dcm/1-050.dcm \n", - " inflating: dcm/1-051.dcm \n", - " inflating: dcm/1-052.dcm \n", - " inflating: dcm/1-053.dcm \n", - " inflating: dcm/1-054.dcm \n", - " inflating: dcm/1-055.dcm \n", - " inflating: dcm/1-056.dcm \n", - " inflating: dcm/1-057.dcm \n", - " inflating: dcm/1-058.dcm \n", - " inflating: dcm/1-059.dcm \n", - " inflating: dcm/1-060.dcm \n", - " inflating: dcm/1-061.dcm \n", - " inflating: dcm/1-062.dcm \n", - " inflating: dcm/1-063.dcm \n", - " inflating: dcm/1-064.dcm \n", - " inflating: dcm/1-065.dcm \n", - " inflating: dcm/1-066.dcm \n", - " inflating: dcm/1-067.dcm \n", - " inflating: dcm/1-068.dcm \n", - " inflating: dcm/1-069.dcm \n", - " inflating: dcm/1-070.dcm \n", - " inflating: dcm/1-071.dcm \n", - " inflating: dcm/1-072.dcm \n", - " inflating: dcm/1-073.dcm \n", - " inflating: dcm/1-074.dcm \n", - " inflating: dcm/1-075.dcm \n", - " inflating: dcm/1-076.dcm \n", - " inflating: dcm/1-077.dcm \n", - " inflating: dcm/1-078.dcm \n", - " inflating: dcm/1-079.dcm \n", - " inflating: dcm/1-080.dcm \n", - " inflating: dcm/1-081.dcm \n", - " inflating: dcm/1-082.dcm \n", - " inflating: dcm/1-083.dcm \n", - " inflating: dcm/1-084.dcm \n", - " inflating: dcm/1-085.dcm \n", - " inflating: dcm/1-086.dcm \n", - " inflating: dcm/1-087.dcm \n", - " inflating: dcm/1-088.dcm \n", - " inflating: dcm/1-089.dcm \n", - " inflating: dcm/1-090.dcm \n", - " inflating: dcm/1-091.dcm \n", - " inflating: dcm/1-092.dcm \n", - " inflating: dcm/1-093.dcm \n", - " inflating: dcm/1-094.dcm \n", - " inflating: dcm/1-095.dcm \n", - " inflating: dcm/1-096.dcm \n", - " inflating: dcm/1-097.dcm \n", - " inflating: dcm/1-098.dcm \n", - " inflating: dcm/1-099.dcm \n", - " inflating: dcm/1-100.dcm \n", - " inflating: dcm/1-101.dcm \n", - " inflating: dcm/1-102.dcm \n", - " inflating: dcm/1-103.dcm \n", - " inflating: dcm/1-104.dcm \n", - " inflating: dcm/1-105.dcm \n", - " inflating: dcm/1-106.dcm \n", - " inflating: dcm/1-107.dcm \n", - " inflating: dcm/1-108.dcm \n", - " inflating: dcm/1-109.dcm \n", - " inflating: dcm/1-110.dcm \n", - " inflating: dcm/1-111.dcm \n", - " inflating: dcm/1-112.dcm \n", - " inflating: dcm/1-113.dcm \n", - " inflating: dcm/1-114.dcm \n", - " inflating: dcm/1-115.dcm \n", - " inflating: dcm/1-116.dcm \n", - " inflating: dcm/1-117.dcm \n", - " inflating: dcm/1-118.dcm \n", - " inflating: dcm/1-119.dcm \n", - " inflating: dcm/1-120.dcm \n", - " inflating: dcm/1-121.dcm \n", - " inflating: dcm/1-122.dcm \n", - " inflating: dcm/1-123.dcm \n", - " inflating: dcm/1-124.dcm \n", - " inflating: dcm/1-125.dcm \n", - " inflating: dcm/1-126.dcm \n", - " inflating: dcm/1-127.dcm \n", - " inflating: dcm/1-128.dcm \n", - " inflating: dcm/1-129.dcm \n", - " inflating: dcm/1-130.dcm \n", - " inflating: dcm/1-131.dcm \n", - " inflating: dcm/1-132.dcm \n", - " inflating: dcm/1-133.dcm \n", - " inflating: dcm/1-134.dcm \n", - " inflating: dcm/1-135.dcm \n", - " inflating: dcm/1-136.dcm \n", - " inflating: dcm/1-137.dcm \n", - " inflating: dcm/1-138.dcm \n", - " inflating: dcm/1-139.dcm \n", - " inflating: dcm/1-140.dcm \n", - " inflating: dcm/1-141.dcm \n", - " inflating: dcm/1-142.dcm \n", - " inflating: dcm/1-143.dcm \n", - " inflating: dcm/1-144.dcm \n", - " inflating: dcm/1-145.dcm \n", - " inflating: dcm/1-146.dcm \n", - " inflating: dcm/1-147.dcm \n", - " inflating: dcm/1-148.dcm \n", - " inflating: dcm/1-149.dcm \n", - " inflating: dcm/1-150.dcm \n", - " inflating: dcm/1-151.dcm \n", - " inflating: dcm/1-152.dcm \n", - " inflating: dcm/1-153.dcm \n", - " inflating: dcm/1-154.dcm \n", - " inflating: dcm/1-155.dcm \n", - " inflating: dcm/1-156.dcm \n", - " inflating: dcm/1-157.dcm \n", - " inflating: dcm/1-158.dcm \n", - " inflating: dcm/1-159.dcm \n", - " inflating: dcm/1-160.dcm \n", - " inflating: dcm/1-161.dcm \n", - " inflating: dcm/1-162.dcm \n", - " inflating: dcm/1-163.dcm \n", - " inflating: dcm/1-164.dcm \n", - " inflating: dcm/1-165.dcm \n", - " inflating: dcm/1-166.dcm \n", - " inflating: dcm/1-167.dcm \n", - " inflating: dcm/1-168.dcm \n", - " inflating: dcm/1-169.dcm \n", - " inflating: dcm/1-170.dcm \n", - " inflating: dcm/1-171.dcm \n", - " inflating: dcm/1-172.dcm \n", - " inflating: dcm/1-173.dcm \n", - " inflating: dcm/1-174.dcm \n", - " inflating: dcm/1-175.dcm \n", - " inflating: dcm/1-176.dcm \n", - " inflating: dcm/1-177.dcm \n", - " inflating: dcm/1-178.dcm \n", - " inflating: dcm/1-179.dcm \n", - " inflating: dcm/1-180.dcm \n", - " inflating: dcm/1-181.dcm \n", - " inflating: dcm/1-182.dcm \n", - " inflating: dcm/1-183.dcm \n", - " inflating: dcm/1-184.dcm \n", - " inflating: dcm/1-185.dcm \n", - " inflating: dcm/1-186.dcm \n", - " inflating: dcm/1-187.dcm \n", - " inflating: dcm/1-188.dcm \n", - " inflating: dcm/1-189.dcm \n", - " inflating: dcm/1-190.dcm \n", - " inflating: dcm/1-191.dcm \n", - " inflating: dcm/1-192.dcm \n", - " inflating: dcm/1-193.dcm \n", - " inflating: dcm/1-194.dcm \n", - " inflating: dcm/1-195.dcm \n", - " inflating: dcm/1-196.dcm \n", - " inflating: dcm/1-197.dcm \n", - " inflating: dcm/1-198.dcm \n", - " inflating: dcm/1-199.dcm \n", - " inflating: dcm/1-200.dcm \n", - " inflating: dcm/1-201.dcm \n", - " inflating: dcm/1-202.dcm \n", - " inflating: dcm/1-203.dcm \n", - " inflating: dcm/1-204.dcm \n", - " inflating: multi_models/pancreas_ct_dints/model.ts \n", - " inflating: multi_models/spleen_ct/model.ts \n" - ] - } - ], + "outputs": [], "source": [ "# Download ai_spleen_bundle_data test data zip file. Please request access and download manually.\n", "# !pip install gdown\n", @@ -405,19 +191,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "env: HOLOSCAN_INPUT_PATH=dcm\n", - "env: HOLOSCAN_MODEL_PATH=multi_models\n", - "env: HOLOSCAN_OUTPUT_PATH=output\n" - ] - } - ], + "outputs": [], "source": [ "models_folder = \"multi_models\"\n", "%env HOLOSCAN_INPUT_PATH dcm\n", @@ -437,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -496,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -723,73 +499,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[info] [fragment.cpp:705] Loading extensions from configs...\n", - "[2025-04-22 12:14:06,240] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=[])\n", - "[2025-04-22 12:14:06,259] [INFO] (root) - AppContext object: AppContext(input_path=dcm, output_path=output, model_path=multi_models, workdir=), triton_server_netloc=\n", - "[2025-04-22 12:14:06,266] [INFO] (root) - End compose\n", - "[info] [gxf_executor.cpp:265] Creating context\n", - "[info] [gxf_executor.cpp:2396] Activating Graph...\n", - "[info] [gxf_executor.cpp:2426] Running Graph...\n", - "[info] [gxf_executor.cpp:2428] Waiting for completion...\n", - "[info] [greedy_scheduler.cpp:191] Scheduling 7 entities\n", - "[2025-04-22 12:14:06,293] [INFO] (monai.deploy.operators.dicom_data_loader_operator.DICOMDataLoaderOperator) - No or invalid input path from the optional input port: None\n", - "[2025-04-22 12:14:06,864] [INFO] (root) - Finding series for Selection named: CT Series\n", - "[2025-04-22 12:14:06,865] [INFO] (root) - Searching study, : 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291\n", - " # of series: 1\n", - "[2025-04-22 12:14:06,866] [INFO] (root) - Working on series, instance UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2025-04-22 12:14:06,866] [INFO] (root) - On attribute: 'StudyDescription' to match value: '(.*?)'\n", - "[2025-04-22 12:14:06,867] [INFO] (root) - Series attribute StudyDescription value: CT ABDOMEN W IV CONTRAST\n", - "[2025-04-22 12:14:06,867] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "[2025-04-22 12:14:06,868] [INFO] (root) - On attribute: 'Modality' to match value: '(?i)CT'\n", - "[2025-04-22 12:14:06,868] [INFO] (root) - Series attribute Modality value: CT\n", - "[2025-04-22 12:14:06,869] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "[2025-04-22 12:14:06,869] [INFO] (root) - On attribute: 'SeriesDescription' to match value: '(.*?)'\n", - "[2025-04-22 12:14:06,871] [INFO] (root) - Series attribute SeriesDescription value: ABD/PANC 3.0 B31f\n", - "[2025-04-22 12:14:06,871] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "[2025-04-22 12:14:06,872] [INFO] (root) - Selected Series, UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2025-04-22 12:14:06,872] [INFO] (root) - Series Selection finalized.\n", - "[2025-04-22 12:14:06,873] [INFO] (root) - Series Description of selected DICOM Series for inference: ABD/PANC 3.0 B31f\n", - "[2025-04-22 12:14:06,873] [INFO] (root) - Series Instance UID of selected DICOM Series for inference: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2025-04-22 12:14:07,392] [INFO] (root) - Casting to float32\n", - "[2025-04-22 12:14:07,618] [INFO] (root) - Parsing from bundle_path: /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/multi_models/pancreas_ct_dints/model.ts\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/monai/bundle/reference_resolver.py:216: UserWarning: Detected deprecated name 'optional_packages_version' in configuration file, replacing with 'required_packages_version'.\n", - " warnings.warn(\n", - "[2025-04-22 12:14:45,024] [INFO] (root) - Parsing from bundle_path: /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/multi_models/spleen_ct/model.ts\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/highdicom/base.py:163: UserWarning: The string \"C3N-00198\" is unlikely to represent the intended person name since it contains only a single component. Construct a person name according to the format in described in https://dicom.nema.org/dicom/2013/output/chtml/part05/sect_6.2.html#sect_6.2.1.2, or, in pydicom 2.2.0 or later, use the pydicom.valuerep.PersonName.from_named_components() method to construct the person name correctly. If a single-component name is really intended, add a trailing caret character to disambiguate the name.\n", - " check_person_name(patient_name)\n", - "[2025-04-22 12:14:48,476] [INFO] (highdicom.base) - copy Image-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 12:14:48,477] [INFO] (highdicom.base) - copy attributes of module \"Specimen\"\n", - "[2025-04-22 12:14:48,478] [INFO] (highdicom.base) - copy Patient-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 12:14:48,478] [INFO] (highdicom.base) - copy attributes of module \"Patient\"\n", - "[2025-04-22 12:14:48,479] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Subject\"\n", - "[2025-04-22 12:14:48,480] [INFO] (highdicom.base) - copy Study-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 12:14:48,480] [INFO] (highdicom.base) - copy attributes of module \"General Study\"\n", - "[2025-04-22 12:14:48,481] [INFO] (highdicom.base) - copy attributes of module \"Patient Study\"\n", - "[2025-04-22 12:14:48,482] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Study\"\n", - "[2025-04-22 12:14:49,557] [INFO] (highdicom.base) - copy Image-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 12:14:49,559] [INFO] (highdicom.base) - copy attributes of module \"Specimen\"\n", - "[2025-04-22 12:14:49,560] [INFO] (highdicom.base) - copy Patient-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 12:14:49,561] [INFO] (highdicom.base) - copy attributes of module \"Patient\"\n", - "[2025-04-22 12:14:49,561] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Subject\"\n", - "[2025-04-22 12:14:49,562] [INFO] (highdicom.base) - copy Study-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 12:14:49,563] [INFO] (highdicom.base) - copy attributes of module \"General Study\"\n", - "[2025-04-22 12:14:49,564] [INFO] (highdicom.base) - copy attributes of module \"Patient Study\"\n", - "[2025-04-22 12:14:49,564] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Study\"\n", - "[info] [greedy_scheduler.cpp:372] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "[info] [greedy_scheduler.cpp:401] Scheduler finished.\n", - "[info] [gxf_executor.cpp:2431] Deactivating Graph...\n", - "[info] [gxf_executor.cpp:2439] Graph execution finished.\n", - "[2025-04-22 12:14:49,692] [INFO] (__main__.App) - End run\n" - ] - } - ], + "outputs": [], "source": [ "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", "app = App().run()" @@ -820,7 +532,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -837,17 +549,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing my_app/app.py\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile my_app/app.py\n", "# Copyright 2021-2023 MONAI Consortium\n", @@ -1101,17 +805,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing my_app/__main__.py\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile my_app/__main__.py\n", "from app import App\n", @@ -1122,17 +818,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "app.py\t__main__.py\n" - ] - } - ], + "outputs": [], "source": [ "!ls my_app" ] @@ -1151,73 +839,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[\u001b[32minfo\u001b[m] [fragment.cpp:705] Loading extensions from configs...\n", - "[2025-04-22 12:14:54,730] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=['my_app'])\n", - "[2025-04-22 12:14:54,735] [INFO] (root) - AppContext object: AppContext(input_path=dcm, output_path=output, model_path=multi_models, workdir=), triton_server_netloc=\n", - "[2025-04-22 12:14:54,737] [INFO] (root) - End compose\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:265] Creating context\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2396] Activating Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2426] Running Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2428] Waiting for completion...\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:191] Scheduling 7 entities\n", - "[2025-04-22 12:14:54,756] [INFO] (monai.deploy.operators.dicom_data_loader_operator.DICOMDataLoaderOperator) - No or invalid input path from the optional input port: None\n", - "[2025-04-22 12:14:55,597] [INFO] (root) - Finding series for Selection named: CT Series\n", - "[2025-04-22 12:14:55,597] [INFO] (root) - Searching study, : 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291\n", - " # of series: 1\n", - "[2025-04-22 12:14:55,597] [INFO] (root) - Working on series, instance UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2025-04-22 12:14:55,597] [INFO] (root) - On attribute: 'StudyDescription' to match value: '(.*?)'\n", - "[2025-04-22 12:14:55,597] [INFO] (root) - Series attribute StudyDescription value: CT ABDOMEN W IV CONTRAST\n", - "[2025-04-22 12:14:55,597] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "[2025-04-22 12:14:55,598] [INFO] (root) - On attribute: 'Modality' to match value: '(?i)CT'\n", - "[2025-04-22 12:14:55,598] [INFO] (root) - Series attribute Modality value: CT\n", - "[2025-04-22 12:14:55,598] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "[2025-04-22 12:14:55,598] [INFO] (root) - On attribute: 'SeriesDescription' to match value: '(.*?)'\n", - "[2025-04-22 12:14:55,598] [INFO] (root) - Series attribute SeriesDescription value: ABD/PANC 3.0 B31f\n", - "[2025-04-22 12:14:55,598] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "[2025-04-22 12:14:55,598] [INFO] (root) - Selected Series, UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2025-04-22 12:14:55,598] [INFO] (root) - Series Selection finalized.\n", - "[2025-04-22 12:14:55,598] [INFO] (root) - Series Description of selected DICOM Series for inference: ABD/PANC 3.0 B31f\n", - "[2025-04-22 12:14:55,598] [INFO] (root) - Series Instance UID of selected DICOM Series for inference: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "[2025-04-22 12:14:55,815] [INFO] (root) - Casting to float32\n", - "[2025-04-22 12:14:55,872] [INFO] (root) - Parsing from bundle_path: /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/multi_models/pancreas_ct_dints/model.ts\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/monai/bundle/reference_resolver.py:216: UserWarning: Detected deprecated name 'optional_packages_version' in configuration file, replacing with 'required_packages_version'.\n", - " warnings.warn(\n", - "[2025-04-22 12:15:29,019] [INFO] (root) - Parsing from bundle_path: /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/multi_models/spleen_ct/model.ts\n", - "/home/mqin/src/monai-deploy-app-sdk/.venv/lib/python3.10/site-packages/highdicom/base.py:163: UserWarning: The string \"C3N-00198\" is unlikely to represent the intended person name since it contains only a single component. Construct a person name according to the format in described in https://dicom.nema.org/dicom/2013/output/chtml/part05/sect_6.2.html#sect_6.2.1.2, or, in pydicom 2.2.0 or later, use the pydicom.valuerep.PersonName.from_named_components() method to construct the person name correctly. If a single-component name is really intended, add a trailing caret character to disambiguate the name.\n", - " check_person_name(patient_name)\n", - "[2025-04-22 12:15:32,361] [INFO] (highdicom.base) - copy Image-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 12:15:32,362] [INFO] (highdicom.base) - copy attributes of module \"Specimen\"\n", - "[2025-04-22 12:15:32,362] [INFO] (highdicom.base) - copy Patient-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 12:15:32,362] [INFO] (highdicom.base) - copy attributes of module \"Patient\"\n", - "[2025-04-22 12:15:32,362] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Subject\"\n", - "[2025-04-22 12:15:32,362] [INFO] (highdicom.base) - copy Study-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 12:15:32,362] [INFO] (highdicom.base) - copy attributes of module \"General Study\"\n", - "[2025-04-22 12:15:32,362] [INFO] (highdicom.base) - copy attributes of module \"Patient Study\"\n", - "[2025-04-22 12:15:32,363] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Study\"\n", - "[2025-04-22 12:15:33,346] [INFO] (highdicom.base) - copy Image-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 12:15:33,346] [INFO] (highdicom.base) - copy attributes of module \"Specimen\"\n", - "[2025-04-22 12:15:33,346] [INFO] (highdicom.base) - copy Patient-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 12:15:33,346] [INFO] (highdicom.base) - copy attributes of module \"Patient\"\n", - "[2025-04-22 12:15:33,346] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Subject\"\n", - "[2025-04-22 12:15:33,346] [INFO] (highdicom.base) - copy Study-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "[2025-04-22 12:15:33,346] [INFO] (highdicom.base) - copy attributes of module \"General Study\"\n", - "[2025-04-22 12:15:33,347] [INFO] (highdicom.base) - copy attributes of module \"Patient Study\"\n", - "[2025-04-22 12:15:33,347] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Study\"\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:372] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "[\u001b[32minfo\u001b[m] [greedy_scheduler.cpp:401] Scheduler finished.\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2431] Deactivating Graph...\n", - "[\u001b[32minfo\u001b[m] [gxf_executor.cpp:2439] Graph execution finished.\n", - "[2025-04-22 12:15:33,435] [INFO] (app.App) - End run\n" - ] - } - ], + "outputs": [], "source": [ "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", "!python my_app" @@ -1225,18 +849,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.2.826.0.1.3680043.10.511.3.34841928451888108286361340675987576.dcm\n", - "1.2.826.0.1.3680043.10.511.3.36403385704959959901485544349934328.dcm\n" - ] - } - ], + "outputs": [], "source": [ "!ls $HOLOSCAN_OUTPUT_PATH" ] @@ -1260,17 +875,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing my_app/app.yaml\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile my_app/app.yaml\n", "%YAML 1.2\n", @@ -1290,17 +897,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing my_app/requirements.txt\n" - ] - } - ], + "outputs": [], "source": [ "%%writefile my_app/requirements.txt\n", "highdicom>=0.18.2\n", @@ -1326,562 +925,23 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2025-04-22 12:15:35,532] [INFO] (common) - Downloading CLI manifest file...\n", - "[2025-04-22 12:15:35,793] [DEBUG] (common) - Validating CLI manifest file...\n", - "[2025-04-22 12:15:35,794] [INFO] (packager.parameters) - Application: /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/my_app\n", - "[2025-04-22 12:15:35,794] [INFO] (packager.parameters) - Detected application type: Python Module\n", - "[2025-04-22 12:15:35,794] [INFO] (packager) - Scanning for models in /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/multi_models...\n", - "[2025-04-22 12:15:35,795] [DEBUG] (packager) - Model spleen_ct=/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/multi_models/spleen_ct added.\n", - "[2025-04-22 12:15:35,795] [DEBUG] (packager) - Model pancreas_ct_dints=/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/multi_models/pancreas_ct_dints added.\n", - "[2025-04-22 12:15:35,795] [INFO] (packager) - Reading application configuration from /home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/my_app/app.yaml...\n", - "[2025-04-22 12:15:35,798] [INFO] (packager) - Generating app.json...\n", - "[2025-04-22 12:15:35,798] [INFO] (packager) - Generating pkg.json...\n", - "[2025-04-22 12:15:35,804] [DEBUG] (common) - \n", - "=============== Begin app.json ===============\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"command\": \"[\\\"python3\\\", \\\"/opt/holoscan/app\\\"]\",\n", - " \"environment\": {\n", - " \"HOLOSCAN_APPLICATION\": \"/opt/holoscan/app\",\n", - " \"HOLOSCAN_INPUT_PATH\": \"input/\",\n", - " \"HOLOSCAN_OUTPUT_PATH\": \"output/\",\n", - " \"HOLOSCAN_WORKDIR\": \"/var/holoscan\",\n", - " \"HOLOSCAN_MODEL_PATH\": \"/opt/holoscan/models\",\n", - " \"HOLOSCAN_CONFIG_PATH\": \"/var/holoscan/app.yaml\",\n", - " \"HOLOSCAN_APP_MANIFEST_PATH\": \"/etc/holoscan/app.json\",\n", - " \"HOLOSCAN_PKG_MANIFEST_PATH\": \"/etc/holoscan/pkg.json\",\n", - " \"HOLOSCAN_DOCS_PATH\": \"/opt/holoscan/docs\",\n", - " \"HOLOSCAN_LOGS_PATH\": \"/var/holoscan/logs\"\n", - " },\n", - " \"input\": {\n", - " \"path\": \"input/\",\n", - " \"formats\": null\n", - " },\n", - " \"liveness\": null,\n", - " \"output\": {\n", - " \"path\": \"output/\",\n", - " \"formats\": null\n", - " },\n", - " \"readiness\": null,\n", - " \"sdk\": \"monai-deploy\",\n", - " \"sdkVersion\": \"3.0.0\",\n", - " \"timeout\": 0,\n", - " \"version\": 1.0,\n", - " \"workingDirectory\": \"/var/holoscan\"\n", - "}\n", - "================ End app.json ================\n", - " \n", - "[2025-04-22 12:15:35,804] [DEBUG] (common) - \n", - "=============== Begin pkg.json ===============\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"applicationRoot\": \"/opt/holoscan/app\",\n", - " \"modelRoot\": \"/opt/holoscan/models\",\n", - " \"models\": {\n", - " \"spleen_ct\": \"/opt/holoscan/models/spleen_ct\",\n", - " \"pancreas_ct_dints\": \"/opt/holoscan/models/pancreas_ct_dints\"\n", - " },\n", - " \"resources\": {\n", - " \"cpu\": 1,\n", - " \"gpu\": 1,\n", - " \"memory\": \"1Gi\",\n", - " \"gpuMemory\": \"10Gi\"\n", - " },\n", - " \"version\": 1.0,\n", - " \"platformConfig\": \"dgpu\"\n", - "}\n", - "================ End pkg.json ================\n", - " \n", - "[2025-04-22 12:15:36,273] [DEBUG] (packager.builder) - \n", - "========== Begin Build Parameters ==========\n", - "{'additional_lib_paths': '',\n", - " 'app_config_file_path': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/my_app/app.yaml'),\n", - " 'app_dir': PosixPath('/opt/holoscan/app'),\n", - " 'app_json': '/etc/holoscan/app.json',\n", - " 'application': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/my_app'),\n", - " 'application_directory': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/my_app'),\n", - " 'application_type': 'PythonModule',\n", - " 'build_cache': PosixPath('/home/mqin/.holoscan_build_cache'),\n", - " 'cmake_args': '',\n", - " 'command': '[\"python3\", \"/opt/holoscan/app\"]',\n", - " 'command_filename': 'my_app',\n", - " 'config_file_path': PosixPath('/var/holoscan/app.yaml'),\n", - " 'docs_dir': PosixPath('/opt/holoscan/docs'),\n", - " 'full_input_path': PosixPath('/var/holoscan/input'),\n", - " 'full_output_path': PosixPath('/var/holoscan/output'),\n", - " 'gid': 1000,\n", - " 'holoscan_sdk_version': '3.1.0',\n", - " 'includes': [],\n", - " 'input_dir': 'input/',\n", - " 'lib_dir': PosixPath('/opt/holoscan/lib'),\n", - " 'logs_dir': PosixPath('/var/holoscan/logs'),\n", - " 'models': {'pancreas_ct_dints': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/multi_models/pancreas_ct_dints'),\n", - " 'spleen_ct': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/multi_models/spleen_ct')},\n", - " 'models_dir': PosixPath('/opt/holoscan/models'),\n", - " 'monai_deploy_app_sdk_version': '3.0.0',\n", - " 'no_cache': False,\n", - " 'output_dir': 'output/',\n", - " 'pip_packages': None,\n", - " 'pkg_json': '/etc/holoscan/pkg.json',\n", - " 'requirements_file_path': PosixPath('/home/mqin/src/monai-deploy-app-sdk/notebooks/tutorials/my_app/requirements.txt'),\n", - " 'sdk': ,\n", - " 'sdk_type': 'monai-deploy',\n", - " 'tarball_output': None,\n", - " 'timeout': 0,\n", - " 'title': 'MONAI Deploy App Package - Multi Model App',\n", - " 'uid': 1000,\n", - " 'username': 'holoscan',\n", - " 'version': 1.0,\n", - " 'working_dir': PosixPath('/var/holoscan')}\n", - "=========== End Build Parameters ===========\n", - "\n", - "[2025-04-22 12:15:36,273] [DEBUG] (packager.builder) - \n", - "========== Begin Platform Parameters ==========\n", - "{'base_image': 'nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04',\n", - " 'build_image': None,\n", - " 'cuda_deb_arch': 'x86_64',\n", - " 'custom_base_image': False,\n", - " 'custom_holoscan_sdk': False,\n", - " 'custom_monai_deploy_sdk': False,\n", - " 'gpu_type': 'dgpu',\n", - " 'holoscan_deb_arch': 'amd64',\n", - " 'holoscan_sdk_file': '3.1.0',\n", - " 'holoscan_sdk_filename': '3.1.0',\n", - " 'monai_deploy_sdk_file': None,\n", - " 'monai_deploy_sdk_filename': None,\n", - " 'tag': 'my_app:1.0',\n", - " 'target_arch': 'x86_64'}\n", - "=========== End Platform Parameters ===========\n", - "\n", - "[2025-04-22 12:15:36,293] [DEBUG] (packager.builder) - \n", - "========== Begin Dockerfile ==========\n", - "\n", - "ARG GPU_TYPE=dgpu\n", - "\n", - "\n", - "\n", - "\n", - "FROM nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04 AS base\n", - "\n", - "RUN apt-get update \\\n", - " && apt-get install -y --no-install-recommends --no-install-suggests \\\n", - " curl \\\n", - " jq \\\n", - " && rm -rf /var/lib/apt/lists/*\n", - "\n", - "\n", - "\n", - "\n", - "# FROM base AS mofed-installer\n", - "# ARG MOFED_VERSION=23.10-2.1.3.1\n", - "\n", - "# # In a container, we only need to install the user space libraries, though the drivers are still\n", - "# # needed on the host.\n", - "# # Note: MOFED's installation is not easily portable, so we can't copy the output of this stage\n", - "# # to our final stage, but must inherit from it. For that reason, we keep track of the build/install\n", - "# # only dependencies in the `MOFED_DEPS` variable (parsing the output of `--check-deps-only`) to\n", - "# # remove them in that same layer, to ensure they are not propagated in the final image.\n", - "# WORKDIR /opt/nvidia/mofed\n", - "# ARG MOFED_INSTALL_FLAGS=\"--dpdk --with-mft --user-space-only --force --without-fw-update\"\n", - "# RUN UBUNTU_VERSION=$(cat /etc/lsb-release | grep DISTRIB_RELEASE | cut -d= -f2) \\\n", - "# && OFED_PACKAGE=\"MLNX_OFED_LINUX-${MOFED_VERSION}-ubuntu${UBUNTU_VERSION}-$(uname -m)\" \\\n", - "# && curl -S -# -o ${OFED_PACKAGE}.tgz -L \\\n", - "# https://www.mellanox.com/downloads/ofed/MLNX_OFED-${MOFED_VERSION}/${OFED_PACKAGE}.tgz \\\n", - "# && tar xf ${OFED_PACKAGE}.tgz \\\n", - "# && MOFED_INSTALLER=$(find . -name mlnxofedinstall -type f -executable -print) \\\n", - "# && MOFED_DEPS=$(${MOFED_INSTALLER} ${MOFED_INSTALL_FLAGS} --check-deps-only 2>/dev/null | tail -n1 | cut -d' ' -f3-) \\\n", - "# && apt-get update \\\n", - "# && apt-get install --no-install-recommends -y ${MOFED_DEPS} \\\n", - "# && ${MOFED_INSTALLER} ${MOFED_INSTALL_FLAGS} \\\n", - "# && rm -r * \\\n", - "# && apt-get remove -y ${MOFED_DEPS} && apt-get autoremove -y \\\n", - "# && rm -rf /var/lib/apt/lists/*\n", - "\n", - "FROM base AS release\n", - "ENV DEBIAN_FRONTEND=noninteractive\n", - "ENV TERM=xterm-256color\n", - "\n", - "ARG GPU_TYPE\n", - "ARG UNAME\n", - "ARG UID\n", - "ARG GID\n", - "\n", - "RUN mkdir -p /etc/holoscan/ \\\n", - " && mkdir -p /opt/holoscan/ \\\n", - " && mkdir -p /var/holoscan \\\n", - " && mkdir -p /opt/holoscan/app \\\n", - " && mkdir -p /var/holoscan/input \\\n", - " && mkdir -p /var/holoscan/output\n", - "\n", - "LABEL base=\"nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\"\n", - "LABEL tag=\"my_app:1.0\"\n", - "LABEL org.opencontainers.image.title=\"MONAI Deploy App Package - Multi Model App\"\n", - "LABEL org.opencontainers.image.version=\"1.0\"\n", - "LABEL org.nvidia.holoscan=\"3.1.0\"\n", - "\n", - "LABEL org.monai.deploy.app-sdk=\"3.0.0\"\n", - "\n", - "ENV HOLOSCAN_INPUT_PATH=/var/holoscan/input\n", - "ENV HOLOSCAN_OUTPUT_PATH=/var/holoscan/output\n", - "ENV HOLOSCAN_WORKDIR=/var/holoscan\n", - "ENV HOLOSCAN_APPLICATION=/opt/holoscan/app\n", - "ENV HOLOSCAN_TIMEOUT=0\n", - "ENV HOLOSCAN_MODEL_PATH=/opt/holoscan/models\n", - "ENV HOLOSCAN_DOCS_PATH=/opt/holoscan/docs\n", - "ENV HOLOSCAN_CONFIG_PATH=/var/holoscan/app.yaml\n", - "ENV HOLOSCAN_APP_MANIFEST_PATH=/etc/holoscan/app.json\n", - "ENV HOLOSCAN_PKG_MANIFEST_PATH=/etc/holoscan/pkg.json\n", - "ENV HOLOSCAN_LOGS_PATH=/var/holoscan/logs\n", - "ENV HOLOSCAN_VERSION=3.1.0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "# If torch is installed, we can skip installing Python\n", - "ENV PYTHON_VERSION=3.10.6-1~22.04\n", - "ENV PYTHON_PIP_VERSION=22.0.2+dfsg-*\n", - "\n", - "RUN apt update \\\n", - " && apt-get install -y --no-install-recommends --no-install-suggests \\\n", - " python3-minimal=${PYTHON_VERSION} \\\n", - " libpython3-stdlib=${PYTHON_VERSION} \\\n", - " python3=${PYTHON_VERSION} \\\n", - " python3-venv=${PYTHON_VERSION} \\\n", - " python3-pip=${PYTHON_PIP_VERSION} \\\n", - " && rm -rf /var/lib/apt/lists/*\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "RUN groupadd -f -g $GID $UNAME\n", - "RUN useradd -rm -d /home/$UNAME -s /bin/bash -g $GID -G sudo -u $UID $UNAME\n", - "RUN chown -R holoscan /var/holoscan && \\\n", - " chown -R holoscan /var/holoscan/input && \\\n", - " chown -R holoscan /var/holoscan/output\n", - "\n", - "# Set the working directory\n", - "WORKDIR /var/holoscan\n", - "\n", - "# Copy HAP/MAP tool script\n", - "COPY ./tools /var/holoscan/tools\n", - "RUN chmod +x /var/holoscan/tools\n", - "\n", - "# Set the working directory\n", - "WORKDIR /var/holoscan\n", - "\n", - "USER $UNAME\n", - "\n", - "ENV PATH=/home/${UNAME}/.local/bin:/opt/nvidia/holoscan/bin:$PATH\n", - "ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/${UNAME}/.local/lib/python3.10/site-packages/holoscan/lib\n", - "\n", - "COPY ./pip/requirements.txt /tmp/requirements.txt\n", - "\n", - "RUN pip install --upgrade pip\n", - "RUN pip install --no-cache-dir --user -r /tmp/requirements.txt\n", - "\n", - "\n", - "# Install MONAI Deploy App SDK\n", - "\n", - "# Install MONAI Deploy from PyPI org\n", - "RUN pip install monai-deploy-app-sdk==3.0.0\n", - "\n", - "\n", - "COPY ./models /opt/holoscan/models\n", - "\n", - "\n", - "COPY ./map/app.json /etc/holoscan/app.json\n", - "COPY ./app.config /var/holoscan/app.yaml\n", - "COPY ./map/pkg.json /etc/holoscan/pkg.json\n", - "\n", - "COPY ./app /opt/holoscan/app\n", - "\n", - "\n", - "ENTRYPOINT [\"/var/holoscan/tools\"]\n", - "=========== End Dockerfile ===========\n", - "\n", - "[2025-04-22 12:15:36,294] [INFO] (packager.builder) - \n", - "===============================================================================\n", - "Building image for: x64-workstation\n", - " Architecture: linux/amd64\n", - " Base Image: nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\n", - " Build Image: N/A\n", - " Cache: Enabled\n", - " Configuration: dgpu\n", - " Holoscan SDK Package: 3.1.0\n", - " MONAI Deploy App SDK Package: N/A\n", - " gRPC Health Probe: N/A\n", - " SDK Version: 3.1.0\n", - " SDK: monai-deploy\n", - " Tag: my_app-x64-workstation-dgpu-linux-amd64:1.0\n", - " Included features/dependencies: N/A\n", - " \n", - "[2025-04-22 12:15:36,708] [INFO] (common) - Using existing Docker BuildKit builder `holoscan_app_builder`\n", - "[2025-04-22 12:15:36,708] [DEBUG] (packager.builder) - Building Holoscan Application Package: tag=my_app-x64-workstation-dgpu-linux-amd64:1.0\n", - "#0 building with \"holoscan_app_builder\" instance using docker-container driver\n", - "\n", - "#1 [internal] load build definition from Dockerfile\n", - "#1 transferring dockerfile: 4.55kB done\n", - "#1 DONE 0.1s\n", - "\n", - "#2 [auth] nvidia/cuda:pull token for nvcr.io\n", - "#2 DONE 0.0s\n", - "\n", - "#3 [internal] load metadata for nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\n", - "#3 DONE 0.5s\n", - "\n", - "#4 [internal] load .dockerignore\n", - "#4 transferring context: 1.80kB done\n", - "#4 DONE 0.1s\n", - "\n", - "#5 importing cache manifest from nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\n", - "#5 ...\n", - "\n", - "#6 [internal] load build context\n", - "#6 DONE 0.0s\n", - "\n", - "#7 importing cache manifest from local:2851983977013277839\n", - "#7 inferred cache manifest type: application/vnd.oci.image.index.v1+json done\n", - "#7 DONE 0.0s\n", - "\n", - "#8 [base 1/2] FROM nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04@sha256:22fc009e5cea0b8b91d94c99fdd419d2366810b5ea835e47b8343bc15800c186\n", - "#8 resolve nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04@sha256:22fc009e5cea0b8b91d94c99fdd419d2366810b5ea835e47b8343bc15800c186 0.0s done\n", - "#8 DONE 0.1s\n", - "\n", - "#5 importing cache manifest from nvcr.io/nvidia/cuda:12.6.0-runtime-ubuntu22.04\n", - "#5 inferred cache manifest type: application/vnd.docker.distribution.manifest.list.v2+json done\n", - "#5 DONE 0.7s\n", - "\n", - "#6 [internal] load build context\n", - "#6 transferring context: 635.92MB 3.7s done\n", - "#6 DONE 3.7s\n", - "\n", - "#9 [release 7/18] COPY ./tools /var/holoscan/tools\n", - "#9 CACHED\n", - "\n", - "#10 [base 2/2] RUN apt-get update && apt-get install -y --no-install-recommends --no-install-suggests curl jq && rm -rf /var/lib/apt/lists/*\n", - "#10 CACHED\n", - "\n", - "#11 [release 8/18] RUN chmod +x /var/holoscan/tools\n", - "#11 CACHED\n", - "\n", - "#12 [release 3/18] RUN groupadd -f -g 1000 holoscan\n", - "#12 CACHED\n", - "\n", - "#13 [release 4/18] RUN useradd -rm -d /home/holoscan -s /bin/bash -g 1000 -G sudo -u 1000 holoscan\n", - "#13 CACHED\n", - "\n", - "#14 [release 6/18] WORKDIR /var/holoscan\n", - "#14 CACHED\n", - "\n", - "#15 [release 2/18] RUN apt update && apt-get install -y --no-install-recommends --no-install-suggests python3-minimal=3.10.6-1~22.04 libpython3-stdlib=3.10.6-1~22.04 python3=3.10.6-1~22.04 python3-venv=3.10.6-1~22.04 python3-pip=22.0.2+dfsg-* && rm -rf /var/lib/apt/lists/*\n", - "#15 CACHED\n", - "\n", - "#16 [release 1/18] RUN mkdir -p /etc/holoscan/ && mkdir -p /opt/holoscan/ && mkdir -p /var/holoscan && mkdir -p /opt/holoscan/app && mkdir -p /var/holoscan/input && mkdir -p /var/holoscan/output\n", - "#16 CACHED\n", - "\n", - "#17 [release 5/18] RUN chown -R holoscan /var/holoscan && chown -R holoscan /var/holoscan/input && chown -R holoscan /var/holoscan/output\n", - "#17 CACHED\n", - "\n", - "#18 [release 9/18] WORKDIR /var/holoscan\n", - "#18 CACHED\n", - "\n", - "#19 [release 10/18] COPY ./pip/requirements.txt /tmp/requirements.txt\n", - "#19 DONE 4.0s\n", - "\n", - "#20 [release 11/18] RUN pip install --upgrade pip\n", - "#20 0.851 Defaulting to user installation because normal site-packages is not writeable\n", - "#20 0.897 Requirement already satisfied: pip in /usr/lib/python3/dist-packages (22.0.2)\n", - "#20 1.075 Collecting pip\n", - "#20 1.173 Downloading pip-25.0.1-py3-none-any.whl (1.8 MB)\n", - "#20 1.340 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 11.4 MB/s eta 0:00:00\n", - "#20 1.372 Installing collected packages: pip\n", - "#20 2.121 Successfully installed pip-25.0.1\n", - "#20 DONE 2.3s\n", - "\n", - "#21 [release 12/18] RUN pip install --no-cache-dir --user -r /tmp/requirements.txt\n", - "#21 0.675 Collecting highdicom>=0.18.2 (from -r /tmp/requirements.txt (line 1))\n", - "#21 0.728 Downloading highdicom-0.25.1-py3-none-any.whl.metadata (5.0 kB)\n", - "#21 0.822 Collecting monai>=1.0 (from -r /tmp/requirements.txt (line 2))\n", - "#21 0.835 Downloading monai-1.4.0-py3-none-any.whl.metadata (11 kB)\n", - "#21 0.931 Collecting nibabel>=3.2.1 (from -r /tmp/requirements.txt (line 3))\n", - "#21 0.961 Downloading nibabel-5.3.2-py3-none-any.whl.metadata (9.1 kB)\n", - "#21 1.149 Collecting numpy>=1.21.6 (from -r /tmp/requirements.txt (line 4))\n", - "#21 1.161 Downloading numpy-2.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (62 kB)\n", - "#21 1.211 Collecting pydicom>=2.3.0 (from -r /tmp/requirements.txt (line 5))\n", - "#21 1.224 Downloading pydicom-3.0.1-py3-none-any.whl.metadata (9.4 kB)\n", - "#21 1.233 Requirement already satisfied: setuptools>=59.5.0 in /usr/lib/python3/dist-packages (from -r /tmp/requirements.txt (line 6)) (59.6.0)\n", - "#21 1.259 Collecting SimpleITK>=2.0.0 (from -r /tmp/requirements.txt (line 7))\n", - "#21 1.272 Downloading SimpleITK-2.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (7.9 kB)\n", - "#21 1.310 Collecting torch>=1.12.0 (from -r /tmp/requirements.txt (line 8))\n", - "#21 1.323 Downloading torch-2.6.0-cp310-cp310-manylinux1_x86_64.whl.metadata (28 kB)\n", - "#21 1.489 Collecting pillow>=8.3 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 1))\n", - "#21 1.500 Downloading pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl.metadata (8.9 kB)\n", - "#21 1.605 Collecting pyjpegls>=1.0.0 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 1))\n", - "#21 1.619 Downloading pyjpegls-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.5 kB)\n", - "#21 1.641 Collecting typing-extensions>=4.0.0 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 1))\n", - "#21 1.652 Downloading typing_extensions-4.13.2-py3-none-any.whl.metadata (3.0 kB)\n", - "#21 1.670 Collecting numpy>=1.21.6 (from -r /tmp/requirements.txt (line 4))\n", - "#21 1.681 Downloading numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)\n", - "#21 1.746 Collecting importlib-resources>=5.12 (from nibabel>=3.2.1->-r /tmp/requirements.txt (line 3))\n", - "#21 1.759 Downloading importlib_resources-6.5.2-py3-none-any.whl.metadata (3.9 kB)\n", - "#21 1.817 Collecting packaging>=20 (from nibabel>=3.2.1->-r /tmp/requirements.txt (line 3))\n", - "#21 1.828 Downloading packaging-25.0-py3-none-any.whl.metadata (3.3 kB)\n", - "#21 1.857 Collecting filelock (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 1.869 Downloading filelock-3.18.0-py3-none-any.whl.metadata (2.9 kB)\n", - "#21 1.897 Collecting networkx (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 1.909 Downloading networkx-3.4.2-py3-none-any.whl.metadata (6.3 kB)\n", - "#21 1.929 Collecting jinja2 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 1.940 Downloading jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB)\n", - "#21 1.966 Collecting fsspec (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 1.979 Downloading fsspec-2025.3.2-py3-none-any.whl.metadata (11 kB)\n", - "#21 2.031 Collecting nvidia-cuda-nvrtc-cu12==12.4.127 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.044 Downloading nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.060 Collecting nvidia-cuda-runtime-cu12==12.4.127 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.073 Downloading nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.097 Collecting nvidia-cuda-cupti-cu12==12.4.127 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.111 Downloading nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", - "#21 2.126 Collecting nvidia-cudnn-cu12==9.1.0.70 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.140 Downloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", - "#21 2.160 Collecting nvidia-cublas-cu12==12.4.5.8 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.212 Downloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.232 Collecting nvidia-cufft-cu12==11.2.1.3 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.245 Downloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.268 Collecting nvidia-curand-cu12==10.3.5.147 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.282 Downloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.298 Collecting nvidia-cusolver-cu12==11.6.1.9 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.312 Downloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", - "#21 2.331 Collecting nvidia-cusparse-cu12==12.3.1.170 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.344 Downloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", - "#21 2.359 Collecting nvidia-cusparselt-cu12==0.6.2 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.373 Downloading nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl.metadata (6.8 kB)\n", - "#21 2.387 Collecting nvidia-nccl-cu12==2.21.5 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.399 Downloading nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl.metadata (1.8 kB)\n", - "#21 2.416 Collecting nvidia-nvtx-cu12==12.4.127 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.429 Downloading nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.7 kB)\n", - "#21 2.445 Collecting nvidia-nvjitlink-cu12==12.4.127 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.457 Downloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "#21 2.483 Collecting triton==3.2.0 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.497 Downloading triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.4 kB)\n", - "#21 2.525 Collecting sympy==1.13.1 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.537 Downloading sympy-1.13.1-py3-none-any.whl.metadata (12 kB)\n", - "#21 2.566 Collecting mpmath<1.4,>=1.1.0 (from sympy==1.13.1->torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.577 Downloading mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB)\n", - "#21 2.597 INFO: pip is looking at multiple versions of pyjpegls to determine which version is compatible with other requirements. This could take a while.\n", - "#21 2.597 Collecting pyjpegls>=1.0.0 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 1))\n", - "#21 2.609 Downloading pyjpegls-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.5 kB)\n", - "#21 2.622 Downloading pyjpegls-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.5 kB)\n", - "#21 2.679 Collecting MarkupSafe>=2.0 (from jinja2->torch>=1.12.0->-r /tmp/requirements.txt (line 8))\n", - "#21 2.690 Downloading MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.0 kB)\n", - "#21 2.717 Downloading highdicom-0.25.1-py3-none-any.whl (1.1 MB)\n", - "#21 3.009 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 4.1 MB/s eta 0:00:00\n", - "#21 3.027 Downloading monai-1.4.0-py3-none-any.whl (1.5 MB)\n", - "#21 3.342 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.5/1.5 MB 5.3 MB/s eta 0:00:00\n", - "#21 3.356 Downloading nibabel-5.3.2-py3-none-any.whl (3.3 MB)\n", - "#21 3.851 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3/3.3 MB 6.7 MB/s eta 0:00:00\n", - "#21 3.867 Downloading numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.2 MB)\n", - "#21 5.943 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 18.2/18.2 MB 8.8 MB/s eta 0:00:00\n", - "#21 5.957 Downloading pydicom-3.0.1-py3-none-any.whl (2.4 MB)\n", - "#21 6.217 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.4/2.4 MB 9.5 MB/s eta 0:00:00\n", - "#21 6.232 Downloading SimpleITK-2.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (52.4 MB)\n", - "#21 16.76 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 52.4/52.4 MB 5.0 MB/s eta 0:00:00\n", - "#21 16.77 Downloading torch-2.6.0-cp310-cp310-manylinux1_x86_64.whl (766.7 MB)\n", - "#21 30.05 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 766.7/766.7 MB 106.7 MB/s eta 0:00:00\n", - "#21 30.07 Downloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl (363.4 MB)\n", - "#21 33.33 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 363.4/363.4 MB 109.6 MB/s eta 0:00:00\n", - "#21 33.34 Downloading nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (13.8 MB)\n", - "#21 33.47 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.8/13.8 MB 113.6 MB/s eta 0:00:00\n", - "#21 33.48 Downloading nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (24.6 MB)\n", - "#21 33.70 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 24.6/24.6 MB 113.8 MB/s eta 0:00:00\n", - "#21 33.71 Downloading nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (883 kB)\n", - "#21 33.72 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 883.7/883.7 kB 194.7 MB/s eta 0:00:00\n", - "#21 33.74 Downloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl (664.8 MB)\n", - "#21 43.59 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 664.8/664.8 MB 77.9 MB/s eta 0:00:00\n", - "#21 43.61 Downloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl (211.5 MB)\n", - "#21 45.79 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 211.5/211.5 MB 96.9 MB/s eta 0:00:00\n", - "#21 45.81 Downloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl (56.3 MB)\n", - "#21 46.32 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 56.3/56.3 MB 109.8 MB/s eta 0:00:00\n", - "#21 46.34 Downloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl (127.9 MB)\n", - "#21 47.45 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 127.9/127.9 MB 116.1 MB/s eta 0:00:00\n", - "#21 47.46 Downloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl (207.5 MB)\n", - "#21 49.33 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 207.5/207.5 MB 111.0 MB/s eta 0:00:00\n", - "#21 49.35 Downloading nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl (150.1 MB)\n", - "#21 50.69 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 150.1/150.1 MB 112.2 MB/s eta 0:00:00\n", - "#21 50.70 Downloading nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl (188.7 MB)\n", - "#21 52.32 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 188.7/188.7 MB 117.0 MB/s eta 0:00:00\n", - "#21 52.34 Downloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (21.1 MB)\n", - "#21 52.52 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 21.1/21.1 MB 117.9 MB/s eta 0:00:00\n", - "#21 52.53 Downloading nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (99 kB)\n", - "#21 52.54 Downloading sympy-1.13.1-py3-none-any.whl (6.2 MB)\n", - "#21 52.60 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.2/6.2 MB 122.9 MB/s eta 0:00:00\n", - "#21 52.62 Downloading triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (253.1 MB)\n", - "#21 55.13 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 253.1/253.1 MB 101.2 MB/s eta 0:00:00\n", - "#21 55.14 Downloading importlib_resources-6.5.2-py3-none-any.whl (37 kB)\n", - "#21 55.15 Downloading packaging-25.0-py3-none-any.whl (66 kB)\n", - "#21 55.17 Downloading pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl (4.6 MB)\n", - "#21 55.21 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.6/4.6 MB 113.8 MB/s eta 0:00:00\n", - "#21 55.30 Downloading pyjpegls-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.7 MB)\n", - "#21 55.32 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.7/2.7 MB 112.6 MB/s eta 0:00:00\n", - "#21 55.34 Downloading typing_extensions-4.13.2-py3-none-any.whl (45 kB)\n", - "#21 55.35 Downloading filelock-3.18.0-py3-none-any.whl (16 kB)\n", - "#21 55.37 Downloading fsspec-2025.3.2-py3-none-any.whl (194 kB)\n", - "#21 55.38 Downloading jinja2-3.1.6-py3-none-any.whl (134 kB)\n", - "#21 55.40 Downloading networkx-3.4.2-py3-none-any.whl (1.7 MB)\n", - "#21 55.42 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 115.7 MB/s eta 0:00:00\n", - "#21 55.43 Downloading MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20 kB)\n", - "#21 55.45 Downloading mpmath-1.3.0-py3-none-any.whl (536 kB)\n", - "#21 55.46 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 536.2/536.2 kB 183.2 MB/s eta 0:00:00\n", - "#21 63.66 Installing collected packages: triton, SimpleITK, nvidia-cusparselt-cu12, mpmath, typing-extensions, sympy, pydicom, pillow, packaging, nvidia-nvtx-cu12, nvidia-nvjitlink-cu12, nvidia-nccl-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, numpy, networkx, MarkupSafe, importlib-resources, fsspec, filelock, pyjpegls, nvidia-cusparse-cu12, nvidia-cudnn-cu12, nibabel, jinja2, nvidia-cusolver-cu12, highdicom, torch, monai\n", - "#21 126.4 Successfully installed MarkupSafe-3.0.2 SimpleITK-2.4.1 filelock-3.18.0 fsspec-2025.3.2 highdicom-0.25.1 importlib-resources-6.5.2 jinja2-3.1.6 monai-1.4.0 mpmath-1.3.0 networkx-3.4.2 nibabel-5.3.2 numpy-1.26.4 nvidia-cublas-cu12-12.4.5.8 nvidia-cuda-cupti-cu12-12.4.127 nvidia-cuda-nvrtc-cu12-12.4.127 nvidia-cuda-runtime-cu12-12.4.127 nvidia-cudnn-cu12-9.1.0.70 nvidia-cufft-cu12-11.2.1.3 nvidia-curand-cu12-10.3.5.147 nvidia-cusolver-cu12-11.6.1.9 nvidia-cusparse-cu12-12.3.1.170 nvidia-cusparselt-cu12-0.6.2 nvidia-nccl-cu12-2.21.5 nvidia-nvjitlink-cu12-12.4.127 nvidia-nvtx-cu12-12.4.127 packaging-25.0 pillow-11.2.1 pydicom-3.0.1 pyjpegls-1.4.0 sympy-1.13.1 torch-2.6.0 triton-3.2.0 typing-extensions-4.13.2\n", - "#21 DONE 127.8s\n", - "\n", - "#22 [release 13/18] RUN pip install monai-deploy-app-sdk==3.0.0\n", - "#22 0.957 Defaulting to user installation because normal site-packages is not writeable\n", - "#22 1.121 ERROR: Could not find a version that satisfies the requirement monai-deploy-app-sdk==3.0.0 (from versions: 0.1.0a2, 0.1.0rc1, 0.1.0rc2, 0.1.0rc3, 0.1.0, 0.1.1rc1, 0.1.1, 0.2.0, 0.2.1, 0.3.0, 0.4.0, 0.5.0, 0.5.1, 0.6.0, 1.0.0, 2.0.0)\n", - "#22 1.240 ERROR: No matching distribution found for monai-deploy-app-sdk==3.0.0\n", - "#22 ERROR: process \"/bin/sh -c pip install monai-deploy-app-sdk==3.0.0\" did not complete successfully: exit code: 1\n", - "------\n", - " > [release 13/18] RUN pip install monai-deploy-app-sdk==3.0.0:\n", - "0.957 Defaulting to user installation because normal site-packages is not writeable\n", - "1.121 ERROR: Could not find a version that satisfies the requirement monai-deploy-app-sdk==3.0.0 (from versions: 0.1.0a2, 0.1.0rc1, 0.1.0rc2, 0.1.0rc3, 0.1.0, 0.1.1rc1, 0.1.1, 0.2.0, 0.2.1, 0.3.0, 0.4.0, 0.5.0, 0.5.1, 0.6.0, 1.0.0, 2.0.0)\n", - "1.240 ERROR: No matching distribution found for monai-deploy-app-sdk==3.0.0\n", - "------\n", - "Dockerfile:137\n", - "--------------------\n", - " 135 | \n", - " 136 | # Install MONAI Deploy from PyPI org\n", - " 137 | >>> RUN pip install monai-deploy-app-sdk==3.0.0\n", - " 138 | \n", - " 139 | \n", - "--------------------\n", - "ERROR: failed to solve: process \"/bin/sh -c pip install monai-deploy-app-sdk==3.0.0\" did not complete successfully: exit code: 1\n", - "[2025-04-22 12:17:58,073] [INFO] (packager) - Build Summary:\n", - "\n", - "Platform: x64-workstation/dgpu\n", - " Status: Failure\n", - " Error: Error building image: see Docker output for additional details.\n", - " \n" - ] - } - ], + "outputs": [], "source": [ "tag_prefix = \"my_app\"\n", "\n", - "!monai-deploy package my_app -m {models_folder} -c my_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG" + "# holoscan-cli downloads packaging manifests from GitHub; use the release tag URL\n", + "# because the files are not kept on the main branch.\n", + "import holoscan_cli\n", + "\n", + "cli_version = holoscan_cli.__version__\n", + "manifest_url = (\n", + " f\"https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/\"\n", + " f\"v{cli_version}/releases/{cli_version}/artifacts-cu12.json\"\n", + ")\n", + "\n", + "!monai-deploy package my_app -m {models_folder} -c my_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12 --source {manifest_url}" ] }, { @@ -1893,17 +953,9 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "my_app-x64-workstation-dgpu-linux-amd64 1.0 aacceda07071 2 hours ago 9.25GB\n" - ] - } - ], + "outputs": [], "source": [ "!docker image ls | grep {tag_prefix}" ] @@ -1922,81 +974,9 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Display manifests and extract MAP contents to the host folder, ./export\n", - "\n", - "============================== app.json ==============================\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"command\": \"[\\\"python3\\\", \\\"/opt/holoscan/app\\\"]\",\n", - " \"environment\": {\n", - " \"HOLOSCAN_APPLICATION\": \"/opt/holoscan/app\",\n", - " \"HOLOSCAN_INPUT_PATH\": \"input/\",\n", - " \"HOLOSCAN_OUTPUT_PATH\": \"output/\",\n", - " \"HOLOSCAN_WORKDIR\": \"/var/holoscan\",\n", - " \"HOLOSCAN_MODEL_PATH\": \"/opt/holoscan/models\",\n", - " \"HOLOSCAN_CONFIG_PATH\": \"/var/holoscan/app.yaml\",\n", - " \"HOLOSCAN_APP_MANIFEST_PATH\": \"/etc/holoscan/app.json\",\n", - " \"HOLOSCAN_PKG_MANIFEST_PATH\": \"/etc/holoscan/pkg.json\",\n", - " \"HOLOSCAN_DOCS_PATH\": \"/opt/holoscan/docs\",\n", - " \"HOLOSCAN_LOGS_PATH\": \"/var/holoscan/logs\"\n", - " },\n", - " \"input\": {\n", - " \"path\": \"input/\",\n", - " \"formats\": null\n", - " },\n", - " \"liveness\": null,\n", - " \"output\": {\n", - " \"path\": \"output/\",\n", - " \"formats\": null\n", - " },\n", - " \"readiness\": null,\n", - " \"sdk\": \"monai-deploy\",\n", - " \"sdkVersion\": \"0.5.1\",\n", - " \"timeout\": 0,\n", - " \"version\": 1,\n", - " \"workingDirectory\": \"/var/holoscan\"\n", - "}\n", - "\n", - "============================== pkg.json ==============================\n", - "{\n", - " \"apiVersion\": \"1.0.0\",\n", - " \"applicationRoot\": \"/opt/holoscan/app\",\n", - " \"modelRoot\": \"/opt/holoscan/models\",\n", - " \"models\": {\n", - " \"model\": \"/opt/holoscan/models/model\"\n", - " },\n", - " \"resources\": {\n", - " \"cpu\": 1,\n", - " \"gpu\": 1,\n", - " \"memory\": \"1Gi\",\n", - " \"gpuMemory\": \"6Gi\"\n", - " },\n", - " \"version\": 1,\n", - " \"platformConfig\": \"dgpu\"\n", - "}\n", - "\n", - "2025-04-22 19:18:00 [INFO] Copying application from /opt/holoscan/app to /var/run/holoscan/export/app\n", - "\n", - "2025-04-22 19:18:00 [INFO] Copying application manifest file from /etc/holoscan/app.json to /var/run/holoscan/export/config/app.json\n", - "2025-04-22 19:18:00 [INFO] Copying pkg manifest file from /etc/holoscan/pkg.json to /var/run/holoscan/export/config/pkg.json\n", - "2025-04-22 19:18:00 [INFO] Copying application configuration from /var/holoscan/app.yaml to /var/run/holoscan/export/config/app.yaml\n", - "\n", - "2025-04-22 19:18:00 [INFO] Copying models from /opt/holoscan/models to /var/run/holoscan/export/models\n", - "\n", - "2025-04-22 19:18:00 [INFO] Copying documentation from /opt/holoscan/docs/ to /var/run/holoscan/export/docs\n", - "2025-04-22 19:18:00 [INFO] '/opt/holoscan/docs/' cannot be found.\n", - "\n", - "app config models\n" - ] - } - ], + "outputs": [], "source": [ "!echo \"Display manifests and extract MAP contents to the host folder, ./export\"\n", "!docker run --rm {tag_prefix}-x64-workstation-dgpu-linux-amd64:1.0 show\n", @@ -2016,145 +996,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2025-04-22 12:18:02,444] [INFO] (runner) - Checking dependencies...\n", - "[2025-04-22 12:18:02,444] [INFO] (runner) - --> Verifying if \"docker\" is installed...\n", - "\n", - "[2025-04-22 12:18:02,445] [INFO] (runner) - --> Verifying if \"docker-buildx\" is installed...\n", - "\n", - "[2025-04-22 12:18:02,445] [INFO] (runner) - --> Verifying if \"my_app-x64-workstation-dgpu-linux-amd64:1.0\" is available...\n", - "\n", - "[2025-04-22 12:18:02,523] [INFO] (runner) - Reading HAP/MAP manifest...\n", - "Successfully copied 2.56kB to /tmp/tmprw2gvfwr/app.json\n", - "Successfully copied 2.05kB to /tmp/tmprw2gvfwr/pkg.json\n", - "991136f12d4255c8e8f7bdbf80acfad80770e774a5441551832ddc3d52c5c4cf\n", - "[2025-04-22 12:18:02,786] [INFO] (runner) - --> Verifying if \"nvidia-ctk\" is installed...\n", - "\n", - "[2025-04-22 12:18:02,787] [INFO] (runner) - --> Verifying \"nvidia-ctk\" version...\n", - "\n", - "[2025-04-22 12:18:03,056] [INFO] (common) - Launching container (4ba4a525283c) using image 'my_app-x64-workstation-dgpu-linux-amd64:1.0'...\n", - " container name: zealous_mclaren\n", - " host name: mingq-dt\n", - " network: host\n", - " user: 1000:1000\n", - " ulimits: memlock=-1:-1, stack=67108864:67108864\n", - " cap_add: CAP_SYS_PTRACE\n", - " ipc mode: host\n", - " shared memory size: 67108864\n", - " devices: \n", - " group_add: 44\n", - "2025-04-22 19:18:03 [INFO] Launching application python3 /opt/holoscan/app ...\n", - "\n", - "[info] [fragment.cpp:705] Loading extensions from configs...\n", - "\n", - "[info] [gxf_executor.cpp:265] Creating context\n", - "\n", - "[2025-04-22 19:18:11,324] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=['/opt/holoscan/app'])\n", - "\n", - "[2025-04-22 19:18:11,326] [INFO] (root) - AppContext object: AppContext(input_path=/var/holoscan/input, output_path=/var/holoscan/output, model_path=/opt/holoscan/models, workdir=/var/holoscan), triton_server_netloc=\n", - "\n", - "[2025-04-22 19:18:11,329] [INFO] (root) - End compose\n", - "\n", - "[info] [gxf_executor.cpp:2396] Activating Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2426] Running Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2428] Waiting for completion...\n", - "\n", - "[info] [greedy_scheduler.cpp:191] Scheduling 6 entities\n", - "\n", - "[2025-04-22 19:18:11,356] [INFO] (monai.deploy.operators.dicom_data_loader_operator.DICOMDataLoaderOperator) - No or invalid input path from the optional input port: None\n", - "\n", - "[2025-04-22 19:18:12,402] [INFO] (root) - Finding series for Selection named: CT Series\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - Searching study, : 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291\n", - "\n", - " # of series: 1\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - Working on series, instance UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - On attribute: 'StudyDescription' to match value: '(.*?)'\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - Series attribute StudyDescription value: CT ABDOMEN W IV CONTRAST\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - On attribute: 'Modality' to match value: '(?i)CT'\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - Series attribute Modality value: CT\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - On attribute: 'SeriesDescription' to match value: '(.*?)'\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - Series attribute SeriesDescription value: ABD/PANC 3.0 B31f\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - Series attribute string value did not match. Try regEx.\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - Selected Series, UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - Series Selection finalized.\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - Series Description of selected DICOM Series for inference: ABD/PANC 3.0 B31f\n", - "\n", - "[2025-04-22 19:18:12,403] [INFO] (root) - Series Instance UID of selected DICOM Series for inference: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239\n", - "\n", - "[2025-04-22 19:18:12,611] [INFO] (root) - Casting to float32\n", - "\n", - "[2025-04-22 19:18:12,667] [INFO] (root) - Parsing from bundle_path: /opt/holoscan/models/model/model.ts\n", - "\n", - "/home/holoscan/.local/lib/python3.10/site-packages/monai/bundle/reference_resolver.py:216: UserWarning: Detected deprecated name 'optional_packages_version' in configuration file, replacing with 'required_packages_version'.\n", - "\n", - " warnings.warn(\n", - "\n", - "[2025-04-22 19:18:16,253] [INFO] (monai.deploy.operators.stl_conversion_operator.STLConversionOperator) - Output will be saved in file /var/holoscan/output/stl/spleen.stl.\n", - "\n", - "[2025-04-22 19:18:17,650] [INFO] (monai.deploy.operators.stl_conversion_operator.SpatialImage) - 3D image\n", - "\n", - "[2025-04-22 19:18:17,650] [INFO] (monai.deploy.operators.stl_conversion_operator.STLConverter) - Image ndarray shape:(204, 512, 512)\n", - "\n", - "/home/holoscan/.local/lib/python3.10/site-packages/highdicom/base.py:163: UserWarning: The string \"C3N-00198\" is unlikely to represent the intended person name since it contains only a single component. Construct a person name according to the format in described in https://dicom.nema.org/dicom/2013/output/chtml/part05/sect_6.2.html#sect_6.2.1.2, or, in pydicom 2.2.0 or later, use the pydicom.valuerep.PersonName.from_named_components() method to construct the person name correctly. If a single-component name is really intended, add a trailing caret character to disambiguate the name.\n", - "\n", - " check_person_name(patient_name)\n", - "\n", - "[2025-04-22 19:18:28,324] [INFO] (highdicom.base) - copy Image-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "\n", - "[2025-04-22 19:18:28,324] [INFO] (highdicom.base) - copy attributes of module \"Specimen\"\n", - "\n", - "[2025-04-22 19:18:28,324] [INFO] (highdicom.base) - copy Patient-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "\n", - "[2025-04-22 19:18:28,324] [INFO] (highdicom.base) - copy attributes of module \"Patient\"\n", - "\n", - "[2025-04-22 19:18:28,324] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Subject\"\n", - "\n", - "[2025-04-22 19:18:28,324] [INFO] (highdicom.base) - copy Study-related attributes from dataset \"1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191\"\n", - "\n", - "[2025-04-22 19:18:28,324] [INFO] (highdicom.base) - copy attributes of module \"General Study\"\n", - "\n", - "[2025-04-22 19:18:28,325] [INFO] (highdicom.base) - copy attributes of module \"Patient Study\"\n", - "\n", - "[2025-04-22 19:18:28,325] [INFO] (highdicom.base) - copy attributes of module \"Clinical Trial Study\"\n", - "\n", - "[info] [greedy_scheduler.cpp:372] Scheduler stopped: Some entities are waiting for execution, but there are no periodic or async entities to get out of the deadlock.\n", - "\n", - "[info] [greedy_scheduler.cpp:401] Scheduler finished.\n", - "\n", - "[info] [gxf_executor.cpp:2431] Deactivating Graph...\n", - "\n", - "[info] [gxf_executor.cpp:2439] Graph execution finished.\n", - "\n", - "[2025-04-22 19:18:28,421] [INFO] (app.AISpleenSegApp) - End run\n", - "\n", - "[2025-04-22 12:18:29,792] [INFO] (common) - Container 'zealous_mclaren'(4ba4a525283c) exited.\n" - ] - } - ], + "outputs": [], "source": [ "# Clear the output folder and run the MAP. The input is expected to be a folder.\n", "!rm -rf $HOLOSCAN_OUTPUT_PATH\n", @@ -2170,17 +1014,9 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.2.826.0.1.3680043.10.511.3.11413742162001654228707576103547421.dcm stl\n" - ] - } - ], + "outputs": [], "source": [ "!ls $HOLOSCAN_OUTPUT_PATH" ] diff --git a/requirements-examples.txt b/requirements-examples.txt index bc9754eb..55f16e02 100644 --- a/requirements-examples.txt +++ b/requirements-examples.txt @@ -10,7 +10,7 @@ numpy-stl>=2.12.0 trimesh>=3.8.11 torch>=2.6.0 monai>=1.3.0 -nvidia-nvimgcodec-cu12>=0.6.1 +nvidia-nvimgcodec-cu12[all]>=0.6.1 nvidia-nvjpeg2k-cu12>=0.9.1 python-gdcm>=3.0.10 pylibjpeg>=2.0 diff --git a/requirements.txt b/requirements.txt index 58f5faa0..70a4812a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -holoscan-cu12 -holoscan-cli +holoscan-cu12>=4.0.0,<4.3.0 +holoscan-cli>=4.0.0,<4.3.0 numpy>=1.21.6 colorama>=0.4.1 tritonclient[all]>=2.53.0 From 382dbde157e71e8e03f84fb1c87de122b6eac9b1 Mon Sep 17 00:00:00 2001 From: M Q Date: Thu, 4 Jun 2026 00:30:28 -0700 Subject: [PATCH 02/11] Address Copilot's reviews Signed-off-by: M Q --- monai/deploy/graphs/__init__.py | 4 ++- monai/deploy/utils/importutil.py | 55 ++++++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/monai/deploy/graphs/__init__.py b/monai/deploy/graphs/__init__.py index 2d76a90f..3370db56 100644 --- a/monai/deploy/graphs/__init__.py +++ b/monai/deploy/graphs/__init__.py @@ -1,6 +1,8 @@ try: from holoscan.flow_graphs import * -except ModuleNotFoundError: +except ModuleNotFoundError as e: + if e.name != "holoscan.flow_graphs": + raise from holoscan.graphs import * # holoscan 4.1.0 renamed FlowGraph to FlowGraphImpl diff --git a/monai/deploy/utils/importutil.py b/monai/deploy/utils/importutil.py index 0295f691..82d953c4 100644 --- a/monai/deploy/utils/importutil.py +++ b/monai/deploy/utils/importutil.py @@ -411,7 +411,39 @@ def dist_requires(project_name: str) -> List[str]: return [] -holoscan_init_content_txt = """ +def _holoscan_package_path() -> Path: + """Return the installed holoscan package directory.""" + import holoscan + + return Path(holoscan.__file__).resolve().parent + + +def _holoscan_graph_module_name(holoscan_pkg_path: Path) -> Optional[str]: + """Return the graph submodule name present in the installed Holoscan package.""" + if (holoscan_pkg_path / "flow_graphs").is_dir(): + return "flow_graphs" + if (holoscan_pkg_path / "graphs").is_dir(): + return "graphs" + return None + + +def _build_holoscan_extra_modules(holoscan_pkg_path: Path) -> list[str]: + extra_modules = [ + "conditions", + "executors", + "logger", + "operators", + "resources", + ] + graph_module = _holoscan_graph_module_name(holoscan_pkg_path) + if graph_module is not None: + extra_modules.insert(2, graph_module) + return extra_modules + + +def _build_holoscan_init_content(extra_modules: list[str]) -> str: + extra_modules_repr = ",\n ".join(f'"{name}"' for name in extra_modules) + return f'''\ # SPDX-FileCopyrightText: Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # @@ -435,13 +467,7 @@ def dist_requires(project_name: str) -> List[str]: # Other modules are exposed to the public API but will only be lazily loaded _EXTRA_MODULES = [ - "conditions", - "executors", - "flow_graphs", # holoscan >= 4.1.0 - "graphs", # holoscan < 4.1.0 - "logger", - "operators", - "resources", + {extra_modules_repr}, ] __all__.extend(_EXTRA_MODULES) @@ -457,25 +483,26 @@ def __getattr__(name): import sys if name in _EXTRA_MODULES: - module_name = f"{__name__}.{name}" + module_name = f"{{__name__}}.{{name}}" module = importlib.import_module(module_name) # import sys.modules[module_name] = module # cache return module else: - raise AttributeError(f"module {__name__} has no attribute {name}") + raise AttributeError(f"module {{__name__}} has no attribute {{name}}") -""" +''' def fix_holoscan_import(): """Fix holoscan __init__ to enable lazy load for avoiding failure on loading low level libs.""" try: - project_name = "holoscan" - holoscan_init_path = Path(dist_module_path(project_name)) / project_name / "__init__.py" + holoscan_pkg_path = _holoscan_package_path() + holoscan_init_path = holoscan_pkg_path / "__init__.py" + extra_modules = _build_holoscan_extra_modules(holoscan_pkg_path) with open(str(holoscan_init_path), "w") as f_w: - f_w.write(holoscan_init_content_txt) + f_w.write(_build_holoscan_init_content(extra_modules)) return str(holoscan_init_path) except Exception as ex: return ex From 9ac5005200079f7a3f93302718d21ec25e7f2844 Mon Sep 17 00:00:00 2001 From: M Q Date: Thu, 4 Jun 2026 00:43:54 -0700 Subject: [PATCH 03/11] Fix formatting issues Signed-off-by: M Q --- monai/deploy/graphs/__init__.py | 25 +++++++++++++++---- .../monet_bundle_inference_operator.py | 7 +++--- monai/deploy/utils/importutil.py | 6 ++--- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/monai/deploy/graphs/__init__.py b/monai/deploy/graphs/__init__.py index 3370db56..c2ef432c 100644 --- a/monai/deploy/graphs/__init__.py +++ b/monai/deploy/graphs/__init__.py @@ -1,10 +1,25 @@ try: - from holoscan.flow_graphs import * + from holoscan.flow_graphs import ( + FlowGraphImpl, + FragmentFlowGraph, + FragmentFlowGraphImpl, + OperatorFlowGraph, + OperatorFlowGraphImpl, + ) + + FlowGraph = FlowGraphImpl + + __all__ = [ + "FlowGraph", + "FlowGraphImpl", + "FragmentFlowGraph", + "FragmentFlowGraphImpl", + "OperatorFlowGraph", + "OperatorFlowGraphImpl", + ] except ModuleNotFoundError as e: if e.name != "holoscan.flow_graphs": raise - from holoscan.graphs import * + from holoscan.graphs import FlowGraph, FragmentFlowGraph, OperatorFlowGraph -# holoscan 4.1.0 renamed FlowGraph to FlowGraphImpl -if "FlowGraph" not in globals() and "FlowGraphImpl" in globals(): - FlowGraph = FlowGraphImpl + __all__ = ["FlowGraph", "FragmentFlowGraph", "OperatorFlowGraph"] diff --git a/monai/deploy/operators/monet_bundle_inference_operator.py b/monai/deploy/operators/monet_bundle_inference_operator.py index 6c19cf71..6e83a41f 100644 --- a/monai/deploy/operators/monet_bundle_inference_operator.py +++ b/monai/deploy/operators/monet_bundle_inference_operator.py @@ -12,11 +12,12 @@ from typing import Any, Dict, Tuple, Union from monai.deploy.core import Image -from monai.deploy.operators.monai_bundle_inference_operator import MonaiBundleInferenceOperator, get_bundle_config -from monai.deploy.utils.importutil import optional_import -from monai.transforms import ConcatItemsd, ResampleToMatch from monai.deploy.core.models.torch_model import TorchScriptModel from monai.deploy.core.models.triton_model import TritonModel +from monai.deploy.operators.monai_bundle_inference_operator import MonaiBundleInferenceOperator +from monai.deploy.utils.importutil import optional_import +from monai.transforms import ConcatItemsd, ResampleToMatch + torch, _ = optional_import("torch", "1.10.2") MetaTensor, _ = optional_import("monai.data.meta_tensor", name="MetaTensor") __all__ = ["MONetBundleInferenceOperator"] diff --git a/monai/deploy/utils/importutil.py b/monai/deploy/utils/importutil.py index 82d953c4..8abbc6ff 100644 --- a/monai/deploy/utils/importutil.py +++ b/monai/deploy/utils/importutil.py @@ -442,8 +442,8 @@ def _build_holoscan_extra_modules(holoscan_pkg_path: Path) -> list[str]: def _build_holoscan_init_content(extra_modules: list[str]) -> str: - extra_modules_repr = ",\n ".join(f'"{name}"' for name in extra_modules) - return f'''\ + extra_modules_repr = ",\n ".join(f'{name!r}' for name in extra_modules) + return f"""\ # SPDX-FileCopyrightText: Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # @@ -490,7 +490,7 @@ def __getattr__(name): else: raise AttributeError(f"module {{__name__}} has no attribute {{name}}") -''' +""" def fix_holoscan_import(): From 5ef99ef95dfef3c1d191cf3b22cafd778f4cad10 Mon Sep 17 00:00:00 2001 From: M Q Date: Thu, 4 Jun 2026 00:54:31 -0700 Subject: [PATCH 04/11] Nit Signed-off-by: M Q --- monai/deploy/utils/importutil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monai/deploy/utils/importutil.py b/monai/deploy/utils/importutil.py index 8abbc6ff..bc105dd5 100644 --- a/monai/deploy/utils/importutil.py +++ b/monai/deploy/utils/importutil.py @@ -442,7 +442,7 @@ def _build_holoscan_extra_modules(holoscan_pkg_path: Path) -> list[str]: def _build_holoscan_init_content(extra_modules: list[str]) -> str: - extra_modules_repr = ",\n ".join(f'{name!r}' for name in extra_modules) + extra_modules_repr = ",\n ".join(f"{name!r}" for name in extra_modules) return f"""\ # SPDX-FileCopyrightText: Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 From f7645c300aa70310695191fad0e6670757134133 Mon Sep 17 00:00:00 2001 From: M Q Date: Thu, 4 Jun 2026 01:09:10 -0700 Subject: [PATCH 05/11] Fix pytype complaints Signed-off-by: M Q --- monai/deploy/graphs/__init__.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/monai/deploy/graphs/__init__.py b/monai/deploy/graphs/__init__.py index c2ef432c..5899b8ff 100644 --- a/monai/deploy/graphs/__init__.py +++ b/monai/deploy/graphs/__init__.py @@ -1,12 +1,22 @@ +import importlib + try: - from holoscan.flow_graphs import ( - FlowGraphImpl, - FragmentFlowGraph, - FragmentFlowGraphImpl, - OperatorFlowGraph, - OperatorFlowGraphImpl, - ) + _flow_graphs = importlib.import_module("holoscan.flow_graphs") +except ModuleNotFoundError as e: + if e.name != "holoscan.flow_graphs": + raise + _graphs = importlib.import_module("holoscan.graphs") + FlowGraph = _graphs.FlowGraph + FragmentFlowGraph = _graphs.FragmentFlowGraph + OperatorFlowGraph = _graphs.OperatorFlowGraph + __all__ = ["FlowGraph", "FragmentFlowGraph", "OperatorFlowGraph"] +else: + FlowGraphImpl = _flow_graphs.FlowGraphImpl + FragmentFlowGraph = _flow_graphs.FragmentFlowGraph + FragmentFlowGraphImpl = _flow_graphs.FragmentFlowGraphImpl + OperatorFlowGraph = _flow_graphs.OperatorFlowGraph + OperatorFlowGraphImpl = _flow_graphs.OperatorFlowGraphImpl FlowGraph = FlowGraphImpl __all__ = [ @@ -17,9 +27,3 @@ "OperatorFlowGraph", "OperatorFlowGraphImpl", ] -except ModuleNotFoundError as e: - if e.name != "holoscan.flow_graphs": - raise - from holoscan.graphs import FlowGraph, FragmentFlowGraph, OperatorFlowGraph - - __all__ = ["FlowGraph", "FragmentFlowGraph", "OperatorFlowGraph"] From f13bf53b5869d3a64e15b20235f16226e5cd0aaf Mon Sep 17 00:00:00 2001 From: M Q Date: Thu, 4 Jun 2026 01:26:11 -0700 Subject: [PATCH 06/11] Fix mypy complaints Signed-off-by: M Q --- monai/deploy/core/models/model.py | 2 +- monai/deploy/operators/monet_bundle_inference_operator.py | 7 +++++-- setup.cfg | 5 ++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/monai/deploy/core/models/model.py b/monai/deploy/core/models/model.py index d69ebca5..cf230855 100644 --- a/monai/deploy/core/models/model.py +++ b/monai/deploy/core/models/model.py @@ -16,7 +16,7 @@ from monai.deploy.exceptions import ItemNotExistsError, UnknownTypeError # Store all supported model types in the order they should be checked -REGISTERED_MODELS = [] +REGISTERED_MODELS: List[type["Model"]] = [] class Model: diff --git a/monai/deploy/operators/monet_bundle_inference_operator.py b/monai/deploy/operators/monet_bundle_inference_operator.py index 6e83a41f..f21f4320 100644 --- a/monai/deploy/operators/monet_bundle_inference_operator.py +++ b/monai/deploy/operators/monet_bundle_inference_operator.py @@ -9,7 +9,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Any, Dict, Tuple, Union +from collections.abc import Hashable, Mapping +from typing import Any, Dict, Tuple, Union, cast from monai.deploy.core import Image from monai.deploy.core.models.torch_model import TorchScriptModel @@ -89,7 +90,9 @@ def predict(self, data: Any, *args, **kwargs) -> Union[Image, Any, Tuple[Any, .. for key in kwargs.keys(): if isinstance(kwargs[key], MetaTensor): multimodal_data[key] = ResampleToMatch(mode="bilinear")(kwargs[key], img_dst=data) - data = ConcatItemsd(keys=list(multimodal_data.keys()), name="image")(multimodal_data)["image"] + data = ConcatItemsd(keys=list(multimodal_data.keys()), name="image")( + cast(Mapping[Hashable, Any], multimodal_data) + )["image"] if len(data.shape) == 4: data = data[None] prediction = self._nnunet_predictor(data) diff --git a/setup.cfg b/setup.cfg index 3134046c..17c587b9 100644 --- a/setup.cfg +++ b/setup.cfg @@ -87,6 +87,9 @@ tag_prefix = parentdir_prefix = [mypy] +# Required for the examples/ tree (many sibling app.py modules). +namespace_packages = True +explicit_package_bases = True # Suppresses error messages about imports that cannot be resolved. ignore_missing_imports = True # Changes the treatment of arguments with a default value of None by not implicitly making their type Optional. @@ -106,7 +109,7 @@ show_error_codes = True # Use visually nicer output in error messages: use soft word wrap, show source code snippets, and show error location markers. pretty = False # Exclude certain files/folders -exclude = (dist|notebooks|platforms)/$ +exclude = (dist|notebooks|platforms|examples|models)/$ [mypy-versioneer] # Ignores all non-fatal errors. From d7fe0b75623d78ca97ff35540fa613ca4520fb03 Mon Sep 17 00:00:00 2001 From: M Q Date: Thu, 4 Jun 2026 01:41:38 -0700 Subject: [PATCH 07/11] Address CoPilot comments Signed-off-by: M Q --- monai/deploy/utils/importutil.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/monai/deploy/utils/importutil.py b/monai/deploy/utils/importutil.py index bc105dd5..35d254a1 100644 --- a/monai/deploy/utils/importutil.py +++ b/monai/deploy/utils/importutil.py @@ -15,6 +15,7 @@ import sys import warnings from functools import lru_cache +import importlib.util from importlib import import_module from importlib.metadata import distributions from pathlib import Path @@ -412,10 +413,19 @@ def dist_requires(project_name: str) -> List[str]: def _holoscan_package_path() -> Path: - """Return the installed holoscan package directory.""" - import holoscan - - return Path(holoscan.__file__).resolve().parent + """Return the installed holoscan package directory without importing holoscan.""" + spec = importlib.util.find_spec("holoscan") + if spec is None: + raise ModuleNotFoundError( + "Holoscan is not installed; cannot locate the holoscan package directory." + ) + if spec.submodule_search_locations: + return Path(spec.submodule_search_locations[0]).resolve() + if spec.origin is None: + raise ModuleNotFoundError( + "Holoscan package spec has no origin or submodule_search_locations." + ) + return Path(spec.origin).resolve().parent def _holoscan_graph_module_name(holoscan_pkg_path: Path) -> Optional[str]: From 562ac048881a1651c462ba0ee05cb56a28c12c17 Mon Sep 17 00:00:00 2001 From: M Q Date: Thu, 4 Jun 2026 01:47:17 -0700 Subject: [PATCH 08/11] isort Signed-off-by: M Q --- monai/deploy/utils/importutil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monai/deploy/utils/importutil.py b/monai/deploy/utils/importutil.py index 35d254a1..2e43da13 100644 --- a/monai/deploy/utils/importutil.py +++ b/monai/deploy/utils/importutil.py @@ -9,13 +9,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +import importlib.util import inspect import re import runpy import sys import warnings from functools import lru_cache -import importlib.util from importlib import import_module from importlib.metadata import distributions from pathlib import Path From acff19450f9bf7946ac421a043f0e330bacc618b Mon Sep 17 00:00:00 2001 From: M Q Date: Thu, 4 Jun 2026 01:54:40 -0700 Subject: [PATCH 09/11] Nit Signed-off-by: M Q --- monai/deploy/utils/importutil.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/monai/deploy/utils/importutil.py b/monai/deploy/utils/importutil.py index 2e43da13..e9e6d596 100644 --- a/monai/deploy/utils/importutil.py +++ b/monai/deploy/utils/importutil.py @@ -416,15 +416,11 @@ def _holoscan_package_path() -> Path: """Return the installed holoscan package directory without importing holoscan.""" spec = importlib.util.find_spec("holoscan") if spec is None: - raise ModuleNotFoundError( - "Holoscan is not installed; cannot locate the holoscan package directory." - ) + raise ModuleNotFoundError("Holoscan is not installed; cannot locate the holoscan package directory.") if spec.submodule_search_locations: return Path(spec.submodule_search_locations[0]).resolve() if spec.origin is None: - raise ModuleNotFoundError( - "Holoscan package spec has no origin or submodule_search_locations." - ) + raise ModuleNotFoundError("Holoscan package spec has no origin or submodule_search_locations.") return Path(spec.origin).resolve().parent From 23403a89b84ee8c5e2a0663d7287349087bf546e Mon Sep 17 00:00:00 2001 From: M Q Date: Fri, 5 Jun 2026 13:41:23 -0700 Subject: [PATCH 10/11] Remove the workaround to specify "--source {manifest_url}" as default resource path was restored Signed-off-by: M Q --- notebooks/tutorials/01_simple_app.ipynb | 12 +----------- notebooks/tutorials/02_mednist_app-prebuilt.ipynb | 12 +----------- notebooks/tutorials/02_mednist_app.ipynb | 12 +----------- notebooks/tutorials/03_segmentation_app.ipynb | 12 +----------- notebooks/tutorials/04_monai_bundle_app.ipynb | 12 +----------- notebooks/tutorials/05_multi_model_app.ipynb | 12 +----------- 6 files changed, 6 insertions(+), 66 deletions(-) diff --git a/notebooks/tutorials/01_simple_app.ipynb b/notebooks/tutorials/01_simple_app.ipynb index b0516a7c..36c3c7d4 100644 --- a/notebooks/tutorials/01_simple_app.ipynb +++ b/notebooks/tutorials/01_simple_app.ipynb @@ -959,17 +959,7 @@ "source": [ "tag_prefix = \"simple_imaging_app\"\n", "\n", - "# holoscan-cli downloads packaging manifests from GitHub; use the release tag URL\n", - "# because the files are not kept on the main branch.\n", - "import holoscan_cli\n", - "\n", - "cli_version = holoscan_cli.__version__\n", - "manifest_url = (\n", - " f\"https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/\"\n", - " f\"v{cli_version}/releases/{cli_version}/artifacts-cu12.json\"\n", - ")\n", - "\n", - "!monai-deploy package simple_imaging_app -c simple_imaging_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 --cuda 12 -l DEBUG --source {manifest_url}" + "!monai-deploy package simple_imaging_app -c simple_imaging_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 --cuda 12 -l DEBUG" ] }, { diff --git a/notebooks/tutorials/02_mednist_app-prebuilt.ipynb b/notebooks/tutorials/02_mednist_app-prebuilt.ipynb index 548977b4..6334d118 100644 --- a/notebooks/tutorials/02_mednist_app-prebuilt.ipynb +++ b/notebooks/tutorials/02_mednist_app-prebuilt.ipynb @@ -161,17 +161,7 @@ "source": [ "tag_prefix = \"mednist_app\"\n", "\n", - "# holoscan-cli downloads packaging manifests from GitHub; use the release tag URL\n", - "# because the files are not kept on the main branch.\n", - "import holoscan_cli\n", - "\n", - "cli_version = holoscan_cli.__version__\n", - "manifest_url = (\n", - " f\"https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/\"\n", - " f\"v{cli_version}/releases/{cli_version}/artifacts-cu12.json\"\n", - ")\n", - "\n", - "!monai-deploy package \"source/examples/apps/mednist_classifier_monaideploy/mednist_classifier_monaideploy.py\" -m {models_folder} -c \"source/examples/apps/mednist_classifier_monaideploy/app.yaml\" -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12 --source {manifest_url}" + "!monai-deploy package \"source/examples/apps/mednist_classifier_monaideploy/mednist_classifier_monaideploy.py\" -m {models_folder} -c \"source/examples/apps/mednist_classifier_monaideploy/app.yaml\" -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12" ] }, { diff --git a/notebooks/tutorials/02_mednist_app.ipynb b/notebooks/tutorials/02_mednist_app.ipynb index 6815a2fb..1dc32db5 100644 --- a/notebooks/tutorials/02_mednist_app.ipynb +++ b/notebooks/tutorials/02_mednist_app.ipynb @@ -1023,17 +1023,7 @@ "source": [ "tag_prefix = \"mednist_app\"\n", "\n", - "# holoscan-cli downloads packaging manifests from GitHub; use the release tag URL\n", - "# because the files are not kept on the main branch.\n", - "import holoscan_cli\n", - "\n", - "cli_version = holoscan_cli.__version__\n", - "manifest_url = (\n", - " f\"https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/\"\n", - " f\"v{cli_version}/releases/{cli_version}/artifacts-cu12.json\"\n", - ")\n", - "\n", - "!monai-deploy package \"mednist_app/mednist_classifier_monaideploy.py\" -m {models_folder} -c \"mednist_app/app.yaml\" -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12 --source {manifest_url}" + "!monai-deploy package \"mednist_app/mednist_classifier_monaideploy.py\" -m {models_folder} -c \"mednist_app/app.yaml\" -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12" ] }, { diff --git a/notebooks/tutorials/03_segmentation_app.ipynb b/notebooks/tutorials/03_segmentation_app.ipynb index fa69ef7a..b9e4d627 100644 --- a/notebooks/tutorials/03_segmentation_app.ipynb +++ b/notebooks/tutorials/03_segmentation_app.ipynb @@ -989,17 +989,7 @@ "source": [ "tag_prefix = \"my_app\"\n", "\n", - "# holoscan-cli downloads packaging manifests from GitHub; use the release tag URL\n", - "# because the files are not kept on the main branch.\n", - "import holoscan_cli\n", - "\n", - "cli_version = holoscan_cli.__version__\n", - "manifest_url = (\n", - " f\"https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/\"\n", - " f\"v{cli_version}/releases/{cli_version}/artifacts-cu12.json\"\n", - ")\n", - "\n", - "!monai-deploy package my_app -m {models_folder} -c my_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12 --source {manifest_url}" + "!monai-deploy package my_app -m {models_folder} -c my_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12" ] }, { diff --git a/notebooks/tutorials/04_monai_bundle_app.ipynb b/notebooks/tutorials/04_monai_bundle_app.ipynb index 883625d8..ca9fbb92 100644 --- a/notebooks/tutorials/04_monai_bundle_app.ipynb +++ b/notebooks/tutorials/04_monai_bundle_app.ipynb @@ -740,17 +740,7 @@ "source": [ "tag_prefix = \"my_app\"\n", "\n", - "# holoscan-cli downloads packaging manifests from GitHub; use the release tag URL\n", - "# because the files are not kept on the main branch.\n", - "import holoscan_cli\n", - "\n", - "cli_version = holoscan_cli.__version__\n", - "manifest_url = (\n", - " f\"https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/\"\n", - " f\"v{cli_version}/releases/{cli_version}/artifacts-cu12.json\"\n", - ")\n", - "\n", - "!monai-deploy package my_app -m {models_folder} -c my_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12 --source {manifest_url}" + "!monai-deploy package my_app -m {models_folder} -c my_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12 " ] }, { diff --git a/notebooks/tutorials/05_multi_model_app.ipynb b/notebooks/tutorials/05_multi_model_app.ipynb index e6d6f169..c68f08a6 100644 --- a/notebooks/tutorials/05_multi_model_app.ipynb +++ b/notebooks/tutorials/05_multi_model_app.ipynb @@ -931,17 +931,7 @@ "source": [ "tag_prefix = \"my_app\"\n", "\n", - "# holoscan-cli downloads packaging manifests from GitHub; use the release tag URL\n", - "# because the files are not kept on the main branch.\n", - "import holoscan_cli\n", - "\n", - "cli_version = holoscan_cli.__version__\n", - "manifest_url = (\n", - " f\"https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/\"\n", - " f\"v{cli_version}/releases/{cli_version}/artifacts-cu12.json\"\n", - ")\n", - "\n", - "!monai-deploy package my_app -m {models_folder} -c my_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12 --source {manifest_url}" + "!monai-deploy package my_app -m {models_folder} -c my_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG --cuda 12" ] }, { From 8f3d6984f960bcefe252a0d9c43d7df95630a06f Mon Sep 17 00:00:00 2001 From: M Q Date: Mon, 8 Jun 2026 15:31:18 -0700 Subject: [PATCH 11/11] Updated README with highest compatible holoscan cli version and simplified the requirements for nvidia-nvimgcodec Signed-off-by: M Q --- README.md | 16 +++++----------- requirements-dev.txt | 3 +-- requirements-examples.txt | 1 - 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 3daac4cf..358cb92d 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,8 @@ pip install monai-deploy-app-sdk ### Prerequisites -- This SDK depends on [NVIDIA Holoscan SDK](https://pypi.org/project/holoscan/) for its core implementation as well as its CLI, hence inherits its prerequisites, e.g. Ubuntu 22.04 with glibc 2.35 on X86-64 and NVIDIA dGPU drivers version 535 or above. +- This SDK depends on [NVIDIA Holoscan SDK](https://pypi.org/project/holoscan/) for its core implementation as well as its CLI, hence inherits its prerequisites, e.g. Ubuntu 22.04 with glibc 2.35 on X86-64 and NVIDIA dGPU drivers version 535 or above. Important to note that `holoscan` and `holoscan-cli` up to v4.2 are compatible. +- Key runtime dependencies also include [nvidia-nvimgcodec](https://pypi.org/project/nvidia-nvimgcodec-cu12/) and its own dependencies for GPU accecelerated DICOM image decoding. - [CUDA 12.2](https://developer.nvidia.com/cuda-12-2-0-download-archive) or above is required along with a supported NVIDIA GPU with at least 8GB of video RAM. - If inference is not used in an example application and a GPU is not installed, at least [CUDA 12 runtime](https://pypi.org/project/nvidia-cuda-runtime-cu12/) is required, as this is one of the requirements of Holoscan SDK. In addition, the `LIB_LIBRARY_PATH` must be set to include the installed shared library, e.g. in a Python 3.10 env, ```export LD_LIBRARY_PATH=`pwd`/.venv/lib/python3.10/site-packages/nvidia/cuda_runtime/lib:$LD_LIBRARY_PATH``` - Python: 3.10 to 3.13 @@ -80,20 +81,13 @@ Tutorials are provided to help getting started with the App SDK, to name but a f #### [2) Creating MedNIST Classifier app](https://monai.readthedocs.io/projects/monai-deploy-app-sdk/en/stable/getting_started/tutorials/mednist_app.html) -YouTube Video (to be updated with the new version): - - [MedNIST Classification Example](https://www.youtube.com/watch?v=WwjilJFHuU4) -### [3) Creating a Segmentation app](https://monai.readthedocs.io/projects/monai-deploy-app-sdk/en/stable/getting_started/tutorials/segmentation_app.html) - -YouTube Video (demonstrating the previous version of the App SDK): - -- [Spleen Organ Segmentation - Jupyter Notebook Tutorial](https://www.youtube.com/watch?v=cqDVxzYt9lY) -- [Spleen Organ Segmentation - Deep Dive](https://www.youtube.com/watch?v=nivgfD4pwWE) +#### [3) Creating a Segmentation app](https://monai.readthedocs.io/projects/monai-deploy-app-sdk/en/stable/getting_started/tutorials/segmentation_app.html) -### [4) Creating a Segmentation app including visualization with Clara Viz](https://monai.readthedocs.io/projects/monai-deploy-app-sdk/en/stable/getting_started/tutorials/segmentation_clara-viz_app.html) +#### [4) Creating a Segmentation app including visualization with Clara Viz](https://monai.readthedocs.io/projects/monai-deploy-app-sdk/en/stable/getting_started/tutorials/segmentation_clara-viz_app.html) -### [5) Creating a Segmentation app consuming a MONAI Bundle](https://monai.readthedocs.io/projects/monai-deploy-app-sdk/en/stable/getting_started/tutorials/monai_bundle_app.html) +#### [5) Creating a Segmentation app consuming a MONAI Bundle](https://monai.readthedocs.io/projects/monai-deploy-app-sdk/en/stable/getting_started/tutorials/monai_bundle_app.html) ### [Examples](https://monai.readthedocs.io/projects/monai-deploy-app-sdk/en/stable/getting_started/examples.html) diff --git a/requirements-dev.txt b/requirements-dev.txt index b725c8d3..8aaab66f 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -34,8 +34,7 @@ nibabel>=3.2.1 numpy-stl>=2.12.0 trimesh>=3.8.11 torch>=2.6.0 -nvidia-nvimgcodec-cu12>=0.6.1 -nvidia-nvjpeg2k-cu12>=0.9.1 +nvidia-nvimgcodec-cu12[all]>=0.6.1 python-gdcm>=3.0.10 pylibjpeg>=2.0 pylibjpeg-libjpeg>=2.1 diff --git a/requirements-examples.txt b/requirements-examples.txt index 55f16e02..0aeb394a 100644 --- a/requirements-examples.txt +++ b/requirements-examples.txt @@ -11,7 +11,6 @@ trimesh>=3.8.11 torch>=2.6.0 monai>=1.3.0 nvidia-nvimgcodec-cu12[all]>=0.6.1 -nvidia-nvjpeg2k-cu12>=0.9.1 python-gdcm>=3.0.10 pylibjpeg>=2.0 pylibjpeg-libjpeg>=2.1