Creating a Segmentation App with MONAI Deploy App SDK#
This tutorial shows how to create an organ segmentation application for a PyTorch model that has been trained with MONAI. Please note that this one does not require the model be a MONAI Bundle.
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.
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.
During model training, input and label images are typically in non-DICOM volumetric image format, e.g., NIfTI and PNG, converted from a specific DICOM study series. Furthermore, the voxel spacings most likely have been re-sampled to be uniform for all images. When integrated with imaging networks and receiving DICOM instances from modalities and Picture Archiving and Communications System, PACS, 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.
In the following sections, we will demonstrate how to create a MONAI Deploy application package using the MONAI Deploy App SDK.
Note
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 NIfTI to DICOM files.
Creating Operators and connecting them in Application class#
We will implement an application that consists of five Operators:
DICOMDataLoaderOperator:
Input(dicom_files): a folder path (
Path)Output(dicom_study_list): a list of DICOM studies in memory (List[
DICOMStudy])
DICOMSeriesSelectorOperator:
Input(dicom_study_list): a list of DICOM studies in memory (List[
DICOMStudy])Input(selection_rules): a selection rule (Dict)
Output(study_selected_series_list): a DICOM series object in memory (
StudySelectedSeries)
DICOMSeriesToVolumeOperator:
Input(study_selected_series_list): a DICOM series object in memory (
StudySelectedSeries)Output(image): an image object in memory (
Image)
SpleenSegOperator:
DICOMSegmentationWriterOperator:
Input(seg_image): a segmentation image object in memory (
Image)Input(study_selected_series_list): a DICOM series object in memory (
StudySelectedSeries)Output(dicom_seg_instance): a file path (
Path)
Note
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.
The workflow of the application would look like this.
%%{init: {"theme": "base", "themeVariables": { "fontSize": "16px"}} }%%
classDiagram
direction TB
DICOMDataLoaderOperator --|> DICOMSeriesSelectorOperator : dicom_study_list...dicom_study_list
DICOMSeriesSelectorOperator --|> DICOMSeriesToVolumeOperator : study_selected_series_list...study_selected_series_list
DICOMSeriesToVolumeOperator --|> SpleenSegOperator : image...image
DICOMSeriesSelectorOperator --|> DICOMSegmentationWriterOperator : study_selected_series_list...study_selected_series_list
SpleenSegOperator --|> DICOMSegmentationWriterOperator : seg_image...seg_image
class DICOMDataLoaderOperator {
<in>dicom_files : DISK
dicom_study_list(out) IN_MEMORY
}
class DICOMSeriesSelectorOperator {
<in>dicom_study_list : IN_MEMORY
<in>selection_rules : IN_MEMORY
study_selected_series_list(out) IN_MEMORY
}
class DICOMSeriesToVolumeOperator {
<in>study_selected_series_list : IN_MEMORY
image(out) IN_MEMORY
}
class SpleenSegOperator {
<in>image : IN_MEMORY
seg_image(out) IN_MEMORY
}
class DICOMSegmentationWriterOperator {
<in>seg_image : IN_MEMORY
<in>study_selected_series_list : IN_MEMORY
dicom_seg_instance(out) DISK
}
Setup environment#
# Install MONAI and other necessary image processing packages for the application
!python -c "import monai" || pip install --upgrade -q "monai"
!python -c "import torch" || pip install -q "torch>=1.10.2"
!python -c "import numpy" || pip install -q "numpy>=1.21"
!python -c "import nibabel" || pip install -q "nibabel>=3.2.1"
!python -c "import pydicom" || pip install -q "pydicom>=1.4.2"
!python -c "import highdicom" || pip install -q "highdicom>=0.18.2"
!python -c "import SimpleITK" || pip install -q "SimpleITK>=2.0.0"
# Install MONAI Deploy App SDK package
!python -c "import monai.deploy" || pip install --upgrade "monai-deploy-app-sdk"
/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.
import pkg_resources
/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.
import pkg_resources
Note: you may need to restart the Jupyter kernel to use the updated packages.
Download/Extract ai_spleen_bundle_data from Google Drive#
Note: Data files are now access controlled. Please first request permission to access the shared folder on Google Drive. Please download zip file, ai_spleen_seg_bundle_data.zip in the ai_spleen_seg_app folder, to the same folder as the notebook example.
# Download ai_spleen_bundle_data test data zip file. Please request access and download manually.
# !pip install gdown
# !gdown "https://drive.google.com/uc?id=1IwWMpbo2fd38fKIqeIdL8SKTGvkn31tK"
# After downloading ai_spleen_bundle_data zip file from the web browser or using gdown,
!unzip -o "ai_spleen_seg_bundle_data.zip"
# Need to copy the model.ts file to its own clean subfolder for packaging, to work around an issue in the Packager
models_folder = "models"
!rm -rf {models_folder} && mkdir -p {models_folder}/model && cp model.ts {models_folder}/model && ls {models_folder}/model
Archive: ai_spleen_seg_bundle_data.zip
inflating: dcm/1-001.dcm
inflating: dcm/1-002.dcm
inflating: dcm/1-003.dcm
inflating: dcm/1-004.dcm
inflating: dcm/1-005.dcm
inflating: dcm/1-006.dcm
inflating: dcm/1-007.dcm
inflating: dcm/1-008.dcm
inflating: dcm/1-009.dcm
inflating: dcm/1-010.dcm
inflating: dcm/1-011.dcm
inflating: dcm/1-012.dcm
inflating: dcm/1-013.dcm
inflating: dcm/1-014.dcm
inflating: dcm/1-015.dcm
inflating: dcm/1-016.dcm
inflating: dcm/1-017.dcm
inflating: dcm/1-018.dcm
inflating: dcm/1-019.dcm
inflating: dcm/1-020.dcm
inflating: dcm/1-021.dcm
inflating: dcm/1-022.dcm
inflating: dcm/1-023.dcm
inflating: dcm/1-024.dcm
inflating: dcm/1-025.dcm
inflating: dcm/1-026.dcm
inflating: dcm/1-027.dcm
inflating: dcm/1-028.dcm
inflating: dcm/1-029.dcm
inflating: dcm/1-030.dcm
inflating: dcm/1-031.dcm
inflating: dcm/1-032.dcm
inflating: dcm/1-033.dcm
inflating: dcm/1-034.dcm
inflating: dcm/1-035.dcm
inflating: dcm/1-036.dcm
inflating: dcm/1-037.dcm
inflating: dcm/1-038.dcm
inflating: dcm/1-039.dcm
inflating: dcm/1-040.dcm
inflating: dcm/1-041.dcm
inflating: dcm/1-042.dcm
inflating: dcm/1-043.dcm
inflating: dcm/1-044.dcm
inflating: dcm/1-045.dcm
inflating: dcm/1-046.dcm
inflating: dcm/1-047.dcm
inflating: dcm/1-048.dcm
inflating: dcm/1-049.dcm
inflating: dcm/1-050.dcm
inflating: dcm/1-051.dcm
inflating: dcm/1-052.dcm
inflating: dcm/1-053.dcm
inflating: dcm/1-054.dcm
inflating: dcm/1-055.dcm
inflating: dcm/1-056.dcm
inflating: dcm/1-057.dcm
inflating: dcm/1-058.dcm
inflating: dcm/1-059.dcm
inflating: dcm/1-060.dcm
inflating: dcm/1-061.dcm
inflating: dcm/1-062.dcm
inflating: dcm/1-063.dcm
inflating: dcm/1-064.dcm
inflating: dcm/1-065.dcm
inflating: dcm/1-066.dcm
inflating: dcm/1-067.dcm
inflating: dcm/1-068.dcm
inflating: dcm/1-069.dcm
inflating: dcm/1-070.dcm
inflating: dcm/1-071.dcm
inflating: dcm/1-072.dcm
inflating: dcm/1-073.dcm
inflating: dcm/1-074.dcm
inflating: dcm/1-075.dcm
inflating: dcm/1-076.dcm
inflating: dcm/1-077.dcm
inflating: dcm/1-078.dcm
inflating: dcm/1-079.dcm
inflating: dcm/1-080.dcm
inflating: dcm/1-081.dcm
inflating: dcm/1-082.dcm
inflating: dcm/1-083.dcm
inflating: dcm/1-084.dcm
inflating: dcm/1-085.dcm
inflating: dcm/1-086.dcm
inflating: dcm/1-087.dcm
inflating: dcm/1-088.dcm
inflating: dcm/1-089.dcm
inflating: dcm/1-090.dcm
inflating: dcm/1-091.dcm
inflating: dcm/1-092.dcm
inflating: dcm/1-093.dcm
inflating: dcm/1-094.dcm
inflating: dcm/1-095.dcm
inflating: dcm/1-096.dcm
inflating: dcm/1-097.dcm
inflating: dcm/1-098.dcm
inflating: dcm/1-099.dcm
inflating: dcm/1-100.dcm
inflating: dcm/1-101.dcm
inflating: dcm/1-102.dcm
inflating: dcm/1-103.dcm
inflating: dcm/1-104.dcm
inflating: dcm/1-105.dcm
inflating: dcm/1-106.dcm
inflating: dcm/1-107.dcm
inflating: dcm/1-108.dcm
inflating: dcm/1-109.dcm
inflating: dcm/1-110.dcm
inflating: dcm/1-111.dcm
inflating: dcm/1-112.dcm
inflating: dcm/1-113.dcm
inflating: dcm/1-114.dcm
inflating: dcm/1-115.dcm
inflating: dcm/1-116.dcm
inflating: dcm/1-117.dcm
inflating: dcm/1-118.dcm
inflating: dcm/1-119.dcm
inflating: dcm/1-120.dcm
inflating: dcm/1-121.dcm
inflating: dcm/1-122.dcm
inflating: dcm/1-123.dcm
inflating: dcm/1-124.dcm
inflating: dcm/1-125.dcm
inflating: dcm/1-126.dcm
inflating: dcm/1-127.dcm
inflating: dcm/1-128.dcm
inflating: dcm/1-129.dcm
inflating: dcm/1-130.dcm
inflating: dcm/1-131.dcm
inflating: dcm/1-132.dcm
inflating: dcm/1-133.dcm
inflating: dcm/1-134.dcm
inflating: dcm/1-135.dcm
inflating: dcm/1-136.dcm
inflating: dcm/1-137.dcm
inflating: dcm/1-138.dcm
inflating: dcm/1-139.dcm
inflating: dcm/1-140.dcm
inflating: dcm/1-141.dcm
inflating: dcm/1-142.dcm
inflating: dcm/1-143.dcm
inflating: dcm/1-144.dcm
inflating: dcm/1-145.dcm
inflating: dcm/1-146.dcm
inflating: dcm/1-147.dcm
inflating: dcm/1-148.dcm
inflating: dcm/1-149.dcm
inflating: dcm/1-150.dcm
inflating: dcm/1-151.dcm
inflating: dcm/1-152.dcm
inflating: dcm/1-153.dcm
inflating: dcm/1-154.dcm
inflating: dcm/1-155.dcm
inflating: dcm/1-156.dcm
inflating: dcm/1-157.dcm
inflating: dcm/1-158.dcm
inflating: dcm/1-159.dcm
inflating: dcm/1-160.dcm
inflating: dcm/1-161.dcm
inflating: dcm/1-162.dcm
inflating: dcm/1-163.dcm
inflating: dcm/1-164.dcm
inflating: dcm/1-165.dcm
inflating: dcm/1-166.dcm
inflating: dcm/1-167.dcm
inflating: dcm/1-168.dcm
inflating: dcm/1-169.dcm
inflating: dcm/1-170.dcm
inflating: dcm/1-171.dcm
inflating: dcm/1-172.dcm
inflating: dcm/1-173.dcm
inflating: dcm/1-174.dcm
inflating: dcm/1-175.dcm
inflating: dcm/1-176.dcm
inflating: dcm/1-177.dcm
inflating: dcm/1-178.dcm
inflating: dcm/1-179.dcm
inflating: dcm/1-180.dcm
inflating: dcm/1-181.dcm
inflating: dcm/1-182.dcm
inflating: dcm/1-183.dcm
inflating: dcm/1-184.dcm
inflating: dcm/1-185.dcm
inflating: dcm/1-186.dcm
inflating: dcm/1-187.dcm
inflating: dcm/1-188.dcm
inflating: dcm/1-189.dcm
inflating: dcm/1-190.dcm
inflating: dcm/1-191.dcm
inflating: dcm/1-192.dcm
inflating: dcm/1-193.dcm
inflating: dcm/1-194.dcm
inflating: dcm/1-195.dcm
inflating: dcm/1-196.dcm
inflating: dcm/1-197.dcm
inflating: dcm/1-198.dcm
inflating: dcm/1-199.dcm
inflating: dcm/1-200.dcm
inflating: dcm/1-201.dcm
inflating: dcm/1-202.dcm
inflating: dcm/1-203.dcm
inflating: dcm/1-204.dcm
inflating: model.ts
model.ts
%env HOLOSCAN_INPUT_PATH dcm
%env HOLOSCAN_MODEL_PATH {models_folder}
%env HOLOSCAN_OUTPUT_PATH output
env: HOLOSCAN_INPUT_PATH=dcm
env: HOLOSCAN_MODEL_PATH=models
env: HOLOSCAN_OUTPUT_PATH=output
Setup imports#
Let’s import necessary classes/decorators to define Application and Operator.
import logging
from numpy import uint8 # Needed if SaveImaged is enabled
from pathlib import Path
# Required for setting SegmentDescription attributes. Direct import as this is not part of App SDK package.
from pydicom.sr.codedict import codes
from monai.deploy.conditions import CountCondition
from monai.deploy.core import AppContext, Application, ConditionType, Fragment, Operator, OperatorSpec
from monai.deploy.core.domain import Image
from monai.deploy.core.io_type import IOType
from monai.deploy.operators.dicom_data_loader_operator import DICOMDataLoaderOperator
from monai.deploy.operators.dicom_seg_writer_operator import DICOMSegmentationWriterOperator, SegmentDescription
from monai.deploy.operators.dicom_series_selector_operator import DICOMSeriesSelectorOperator
from monai.deploy.operators.dicom_series_to_volume_operator import DICOMSeriesToVolumeOperator
from monai.deploy.operators.monai_seg_inference_operator import InfererType, InMemImageReader, MonaiSegInferenceOperator
from monai.transforms import (
Activationsd,
AsDiscreted,
Compose,
EnsureChannelFirstd,
EnsureTyped,
Invertd,
LoadImaged,
Orientationd,
SaveImaged,
ScaleIntensityRanged,
Spacingd,
)
/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.
import pkg_resources
Creating Model Specific Inference Operator classes#
Each Operator class inherits the base Operator class. The input/output properties are specified by implementing the setup() method, and the business logic implemented in the compute() method.
The App SDK provides a MonaiSegInferenceOperator class to perform segmentation prediction with a Torch Script model. For consistency, this class uses MONAI dictionary-based transforms, as Compose object, for pre and post transforms. The model-specific inference operator will then only need to create the pre and post transform Compose based on what has been used in the model during training and validation. Note that for deploy application, ignite is not needed nor supported.
SpleenSegOperator#
The SpleenSegOperator gets as input an in-memory Image object that has been converted from a DICOM CT series by the preceding DICOMSeriesToVolumeOperator, and as output in-memory segmentation Image object.
The pre_process function creates the pre-transforms Compose object. For LoadImage, a specialized InMemImageReader, derived from MONAI ImageReader, is used to convert the in-memory pixel data and return the numpy array as well as the meta-data. Also, the DICOM input pixel spacings are often not the same as expected by the model, so the Spacingd transform must be used to re-sample the image with the expected spacing.
The post_process function creates the post-transform Compose object. The SaveImageD transform class is used to save the segmentation mask as NIfTI image file, which is optional as the in-memory mask image will be passed down to the DICOM Segmentation writer for creating a DICOM Segmentation instance. The Invertd must also be used to revert the segmentation image’s orientation and spacing to be the same as the input.
When the MonaiSegInferenceOperator object is created, the ROI size is specified, as well as the transform Compose objects. Furthermore, the dataset image key names are set accordingly.
Loading of the model and performing the prediction are encapsulated in the MonaiSegInferenceOperator and other SDK classes. Once the inference is completed, the segmentation Image object is created and set to the output by the SpleenSegOperator.
class SpleenSegOperator(Operator):
"""Performs Spleen segmentation with a 3D image converted from a DICOM CT series.
"""
DEFAULT_OUTPUT_FOLDER = Path.cwd() / "output/saved_images_folder"
def __init__(
self,
fragment: Fragment,
*args,
app_context: AppContext,
model_path: Path,
output_folder: Path = DEFAULT_OUTPUT_FOLDER,
**kwargs,
):
self.logger = logging.getLogger("{}.{}".format(__name__, type(self).__name__))
self._input_dataset_key = "image"
self._pred_dataset_key = "pred"
self.model_path = model_path
self.output_folder = output_folder
self.output_folder.mkdir(parents=True, exist_ok=True)
self.app_context = app_context
self.input_name_image = "image"
self.output_name_seg = "seg_image"
self.output_name_saved_images_folder = "saved_images_folder"
# The base class has an attribute called fragment to hold the reference to the fragment object
super().__init__(fragment, *args, **kwargs)
def setup(self, spec: OperatorSpec):
spec.input(self.input_name_image)
spec.output(self.output_name_seg)
spec.output(self.output_name_saved_images_folder).condition(
ConditionType.NONE
) # Output not requiring a receiver
def compute(self, op_input, op_output, context):
input_image = op_input.receive(self.input_name_image)
if not input_image:
raise ValueError("Input image is not found.")
# This operator gets an in-memory Image object, so a specialized ImageReader is needed.
_reader = InMemImageReader(input_image)
pre_transforms = self.pre_process(_reader, str(self.output_folder))
post_transforms = self.post_process(pre_transforms, str(self.output_folder))
# Delegates inference and saving output to the built-in operator.
infer_operator = MonaiSegInferenceOperator(
self.fragment,
roi_size=(
96,
96,
96,
),
pre_transforms=pre_transforms,
post_transforms=post_transforms,
overlap=0.6,
app_context=self.app_context,
model_name="",
inferer=InfererType.SLIDING_WINDOW,
sw_batch_size=4,
model_path=self.model_path,
name="monai_seg_inference_op",
)
# Setting the keys used in the dictionary based transforms may change.
infer_operator.input_dataset_key = self._input_dataset_key
infer_operator.pred_dataset_key = self._pred_dataset_key
# Now emit data to the output ports of this operator
op_output.emit(infer_operator.compute_impl(input_image, context), self.output_name_seg)
op_output.emit(self.output_folder, self.output_name_saved_images_folder)
def pre_process(self, img_reader, out_dir: str = "./input_images") -> Compose:
"""Composes transforms for preprocessing input before predicting on a model."""
Path(out_dir).mkdir(parents=True, exist_ok=True)
my_key = self._input_dataset_key
return Compose(
[
LoadImaged(keys=my_key, reader=img_reader),
EnsureChannelFirstd(keys=my_key),
# The SaveImaged transform can be commented out to save 5 seconds.
# Uncompress NIfTI file, nii, is used favoring speed over size, but can be changed to nii.gz
SaveImaged(
keys=my_key,
output_dir=out_dir,
output_postfix="",
resample=False,
output_ext=".nii",
),
Orientationd(keys=my_key, axcodes="RAS"),
Spacingd(keys=my_key, pixdim=[1.5, 1.5, 2.9], mode=["bilinear"]),
ScaleIntensityRanged(keys=my_key, a_min=-57, a_max=164, b_min=0.0, b_max=1.0, clip=True),
EnsureTyped(keys=my_key),
]
)
def post_process(self, pre_transforms: Compose, out_dir: str = "./prediction_output") -> Compose:
"""Composes transforms for postprocessing the prediction results."""
Path(out_dir).mkdir(parents=True, exist_ok=True)
pred_key = self._pred_dataset_key
return Compose(
[
Activationsd(keys=pred_key, softmax=True),
Invertd(
keys=pred_key,
transform=pre_transforms,
orig_keys=self._input_dataset_key,
nearest_interp=False,
to_tensor=True,
),
AsDiscreted(keys=pred_key, argmax=True),
# The SaveImaged transform can be commented out to save 5 seconds.
# Uncompress NIfTI file, nii, is used favoring speed over size, but can be changed to nii.gz
SaveImaged(
keys=pred_key,
output_dir=out_dir,
output_postfix="seg",
output_dtype=uint8,
resample=False,
output_ext=".nii",
),
]
)
Creating Application class#
Our application class would look like below.
It defines App class, inheriting the base Application class.
The base class method, compose, is overridden. Objects required for DICOM parsing, series selection, pixel data conversion to volume image, and segmentation instance creation are created, so is the model-specific SpleenSegOperator. The execution pipeline, as a Directed Acyclic Graph (DAG), is created by connecting these objects through the add_flow method.
class AISpleenSegApp(Application):
def __init__(self, *args, **kwargs):
"""Creates an application instance."""
super().__init__(*args, **kwargs)
self._logger = logging.getLogger("{}.{}".format(__name__, type(self).__name__))
def run(self, *args, **kwargs):
# This method calls the base class to run. Can be omitted if simply calling through.
self._logger.info(f"Begin {self.run.__name__}")
super().run(*args, **kwargs)
self._logger.info(f"End {self.run.__name__}")
def compose(self):
"""Creates the app specific operators and chain them up in the processing DAG."""
self._logger.debug(f"Begin {self.compose.__name__}")
app_context = Application.init_app_context({}) # Do not pass argv in Jupyter Notebook
app_input_path = Path(app_context.input_path)
app_output_path = Path(app_context.output_path)
model_path = Path(app_context.model_path)
self._logger.info(f"App input and output path: {app_input_path}, {app_output_path}")
# instantiates the SDK built-in operator(s).
study_loader_op = DICOMDataLoaderOperator(
self, CountCondition(self, 1), input_folder=app_input_path, name="dcm_loader_op"
)
series_selector_op = DICOMSeriesSelectorOperator(self, rules=Sample_Rules_Text, name="series_selector_op")
series_to_vol_op = DICOMSeriesToVolumeOperator(self, name="series_to_vol_op")
# Model specific inference operator, supporting MONAI transforms.
spleen_seg_op = SpleenSegOperator(self, app_context=app_context, model_path=model_path, name="seg_op")
# Create DICOM Seg writer providing the required segment description for each segment with
# the actual algorithm and the pertinent organ/tissue.
# The segment_label, algorithm_name, and algorithm_version are limited to 64 chars.
# https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_6.2.html
# User can Look up SNOMED CT codes at, e.g.
# https://bioportal.bioontology.org/ontologies/SNOMEDCT
_algorithm_name = "3D segmentation of the Spleen from a CT series"
_algorithm_family = codes.DCM.ArtificialIntelligence
_algorithm_version = "0.1.0"
segment_descriptions = [
SegmentDescription(
segment_label="Spleen",
segmented_property_category=codes.SCT.Organ,
segmented_property_type=codes.SCT.Spleen,
algorithm_name=_algorithm_name,
algorithm_family=_algorithm_family,
algorithm_version=_algorithm_version,
),
]
custom_tags = {"SeriesDescription": "AI generated Seg, not for clinical use."}
dicom_seg_writer = DICOMSegmentationWriterOperator(
self,
segment_descriptions=segment_descriptions,
custom_tags=custom_tags,
output_folder=app_output_path,
name="dcm_seg_writer_op",
)
# Create the processing pipeline, by specifying the source and destination operators, and
# ensuring the output from the former matches the input of the latter, in both name and type.
self.add_flow(study_loader_op, series_selector_op, {("dicom_study_list", "dicom_study_list")})
self.add_flow(
series_selector_op, series_to_vol_op, {("study_selected_series_list", "study_selected_series_list")}
)
self.add_flow(series_to_vol_op, spleen_seg_op, {("image", "image")})
# Note below the dicom_seg_writer requires two inputs, each coming from a source operator.
self.add_flow(
series_selector_op, dicom_seg_writer, {("study_selected_series_list", "study_selected_series_list")}
)
self.add_flow(spleen_seg_op, dicom_seg_writer, {("seg_image", "seg_image")})
self._logger.debug(f"End {self.compose.__name__}")
# This is a sample series selection rule in JSON, simply selecting CT series.
# If the study has more than 1 CT series, then all of them will be selected.
# Please see more detail in DICOMSeriesSelectorOperator.
# For list of string values, e.g. "ImageType": ["PRIMARY", "ORIGINAL"], it is a match if all elements
# are all in the multi-value attribute of the DICOM series.
Sample_Rules_Text = """
{
"selections": [
{
"name": "CT Series",
"conditions": {
"StudyDescription": "(.*?)",
"Modality": "(?i)CT",
"SeriesDescription": "(.*?)",
"ImageType": ["PRIMARY", "ORIGINAL"]
}
}
]
}
"""
Executing app locally#
We can execute the app in Jupyter notebook. Note that the DICOM files of the CT Abdomen series must be present in the dcm folder and the TorchScript, model.ts, in the folder pointed to by the environment variables.
!rm -rf $HOLOSCAN_OUTPUT_PATH
app = AISpleenSegApp()
app.run()
[info] [fragment.cpp:969] Loading extensions from configs...
[2025-10-30 12:10:07,210] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=[])
[2025-10-30 12:10:07,220] [INFO] (root) - AppContext object: AppContext(input_path=dcm, output_path=output, model_path=models, workdir=), triton_server_netloc=
[2025-10-30 12:10:07,221] [INFO] (__main__.AISpleenSegApp) - App input and output path: dcm, output
[info] [gxf_executor.cpp:344] Creating context
[info] [gxf_executor.cpp:2508] Activating Graph...
[info] [gxf_executor.cpp:2579] Running Graph...
[info] [gxf_executor.cpp:2581] Waiting for completion...
[info] [greedy_scheduler.cpp:191] Scheduling 5 entities
[2025-10-30 12:10:07,479] [INFO] (monai.deploy.operators.dicom_data_loader_operator.DICOMDataLoaderOperator) - No or invalid input path from the optional input port: None
[2025-10-30 12:10:07,781] [INFO] (root) - Finding series for Selection named: CT Series
[2025-10-30 12:10:07,782] [INFO] (root) - Searching study, : 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291
# of series: 1
[2025-10-30 12:10:07,783] [INFO] (root) - Working on series, instance UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239
[2025-10-30 12:10:07,784] [INFO] (root) - On attribute: 'StudyDescription' to match value: '(.*?)'
[2025-10-30 12:10:07,785] [INFO] (root) - Series attribute StudyDescription value: CT ABDOMEN W IV CONTRAST
[2025-10-30 12:10:07,785] [INFO] (root) - On attribute: 'Modality' to match value: '(?i)CT'
[2025-10-30 12:10:07,786] [INFO] (root) - Series attribute Modality value: CT
[2025-10-30 12:10:07,787] [INFO] (root) - On attribute: 'SeriesDescription' to match value: '(.*?)'
[2025-10-30 12:10:07,788] [INFO] (root) - Series attribute SeriesDescription value: ABD/PANC 3.0 B31f
[2025-10-30 12:10:07,788] [INFO] (root) - On attribute: 'ImageType' to match value: ['PRIMARY', 'ORIGINAL']
[2025-10-30 12:10:07,789] [INFO] (root) - Series attribute ImageType value: None
[2025-10-30 12:10:07,790] [INFO] (root) - Instance level attribute ImageType value: ["['ORIGINAL', 'PRIMARY', 'AXIAL', 'CT_SOM5 SPI']"]
[2025-10-30 12:10:07,791] [INFO] (root) - Selected Series, UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239
[2025-10-30 12:10:07,792] [INFO] (root) - Series Selection finalized
[2025-10-30 12:10:07,792] [INFO] (root) - Series Description of selected DICOM Series for inference: ABD/PANC 3.0 B31f
[2025-10-30 12:10:07,793] [INFO] (root) - Series Instance UID of selected DICOM Series for inference: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239
/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.
warn_deprecated(argname, msg, warning_category)
[2025-10-30 12:10:08,151] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Converted Image object metadata:
[2025-10-30 12:10:08,152] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesInstanceUID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239, type <class 'str'>
[2025-10-30 12:10:08,153] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesDate: 20090831, type <class 'str'>
[2025-10-30 12:10:08,154] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesTime: 101721.452, type <class 'str'>
[2025-10-30 12:10:08,154] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Modality: CT, type <class 'str'>
[2025-10-30 12:10:08,155] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesDescription: ABD/PANC 3.0 B31f, type <class 'str'>
[2025-10-30 12:10:08,156] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - PatientPosition: HFS, type <class 'str'>
[2025-10-30 12:10:08,156] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesNumber: 8, type <class 'int'>
[2025-10-30 12:10:08,157] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - row_pixel_spacing: 0.7890625, type <class 'float'>
[2025-10-30 12:10:08,158] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - col_pixel_spacing: 0.7890625, type <class 'float'>
[2025-10-30 12:10:08,159] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - depth_pixel_spacing: 1.5, type <class 'float'>
[2025-10-30 12:10:08,160] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - row_direction_cosine: [1.0, 0.0, 0.0], type <class 'list'>
[2025-10-30 12:10:08,161] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - col_direction_cosine: [0.0, 1.0, 0.0], type <class 'list'>
[2025-10-30 12:10:08,162] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - depth_direction_cosine: [0.0, 0.0, 1.0], type <class 'list'>
[2025-10-30 12:10:08,164] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - dicom_affine_transform: [[ 0.7890625 0. 0. -197.60547 ]
[ 0. 0.7890625 0. -398.60547 ]
[ 0. 0. 1.5 -383. ]
[ 0. 0. 0. 1. ]], type <class 'numpy.ndarray'>
[2025-10-30 12:10:08,165] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - nifti_affine_transform: [[ -0.7890625 -0. -0. 197.60547 ]
[ -0. -0.7890625 -0. 398.60547 ]
[ 0. 0. 1.5 -383. ]
[ 0. 0. 0. 1. ]], type <class 'numpy.ndarray'>
[2025-10-30 12:10:08,166] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyInstanceUID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291, type <class 'str'>
[2025-10-30 12:10:08,167] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyID: , type <class 'str'>
[2025-10-30 12:10:08,168] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyDate: 20090831, type <class 'str'>
[2025-10-30 12:10:08,169] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyTime: 095948.599, type <class 'str'>
[2025-10-30 12:10:08,170] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyDescription: CT ABDOMEN W IV CONTRAST, type <class 'str'>
[2025-10-30 12:10:08,171] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - AccessionNumber: 5471978513296937, type <class 'str'>
[2025-10-30 12:10:08,171] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - selection_name: CT Series, type <class 'str'>
[2025-10-30 12:10:08,173] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - affine: [[ -0.7890625 -0. -0. 197.60547 ]
[ -0. -0.7890625 -0. 398.60547 ]
[ 0. 0. 1.5 -383. ]
[ 0. 0. 0. 1. ]], type <class 'numpy.ndarray'>
[2025-10-30 12:10:08,173] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - space: RAS, type <class 'str'>
2025-10-30 12:10:08,788 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
[2025-10-30 12:10:10,438] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Input of <class 'monai.data.meta_tensor.MetaTensor'> shape: torch.Size([1, 1, 270, 270, 106])
/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:345.)
win_data = torch.cat([inputs[win_slice] for win_slice in unravel_slice]).to(sw_device)
/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:345.)
out[idx_zm] += p
2025-10-30 12:10:11,443 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
[2025-10-30 12:10:12,901] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform length/batch size of output: 1
[2025-10-30 12:10:12,904] [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)
[2025-10-30 12:10:13,033] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform pred of <class 'numpy.ndarray'> shape: (1, 512, 512, 204)
[2025-10-30 12:10:13,071] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Output Seg image numpy array of type <class 'numpy.ndarray'> shape: (204, 512, 512)
[2025-10-30 12:10:13,077] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Output Seg image pixel max value: 1
/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.
check_person_name(patient_name)
[2025-10-30 12:10:14,403] [INFO] (highdicom.base) - copy Image-related attributes from dataset "1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191"
[2025-10-30 12:10:14,405] [INFO] (highdicom.base) - copy attributes of module "Specimen"
[2025-10-30 12:10:14,405] [INFO] (highdicom.base) - copy Patient-related attributes from dataset "1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191"
[2025-10-30 12:10:14,406] [INFO] (highdicom.base) - copy attributes of module "Patient"
[2025-10-30 12:10:14,407] [INFO] (highdicom.base) - copy attributes of module "Clinical Trial Subject"
[2025-10-30 12:10:14,408] [INFO] (highdicom.base) - copy Study-related attributes from dataset "1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191"
[2025-10-30 12:10:14,408] [INFO] (highdicom.base) - copy attributes of module "General Study"
[2025-10-30 12:10:14,409] [INFO] (highdicom.base) - copy attributes of module "Patient Study"
[2025-10-30 12:10:14,410] [INFO] (highdicom.base) - copy attributes of module "Clinical Trial Study"
[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.
[info] [greedy_scheduler.cpp:401] Scheduler finished.
[info] [gxf_executor.cpp:2588] Deactivating Graph...
[info] [gxf_executor.cpp:2597] Graph execution finished.
[2025-10-30 12:10:14,509] [INFO] (__main__.AISpleenSegApp) - End run
Once the application is verified inside Jupyter notebook, we can write the above Python code into Python files in an application folder.
The application folder structure would look like below:
my_app
├── __main__.py
├── app.py
└── spleen_seg_operator.py
Note
We can create a single application Python file (such as spleen_app.py) that includes the content of the files, instead of creating multiple files.
You will see such an example in MedNist Classifier Tutorial.
# Create an application folder
!mkdir -p my_app && rm -rf my_app/*
spleen_seg_operator.py#
%%writefile my_app/spleen_seg_operator.py
import logging
from numpy import uint8
from pathlib import Path
from monai.deploy.core import AppContext, ConditionType, Fragment, Operator, OperatorSpec
from monai.deploy.operators.monai_seg_inference_operator import InfererType, InMemImageReader, MonaiSegInferenceOperator
from monai.transforms import (
Activationsd,
AsDiscreted,
Compose,
EnsureChannelFirstd,
EnsureTyped,
Invertd,
LoadImaged,
Orientationd,
SaveImaged,
ScaleIntensityRanged,
Spacingd,
)
class SpleenSegOperator(Operator):
"""Performs Spleen segmentation with a 3D image converted from a DICOM CT series.
"""
DEFAULT_OUTPUT_FOLDER = Path.cwd() / "output/saved_images_folder"
def __init__(
self,
fragment: Fragment,
*args,
app_context: AppContext,
model_path: Path,
output_folder: Path = DEFAULT_OUTPUT_FOLDER,
**kwargs,
):
self.logger = logging.getLogger("{}.{}".format(__name__, type(self).__name__))
self._input_dataset_key = "image"
self._pred_dataset_key = "pred"
self.model_path = model_path
self.output_folder = output_folder
self.output_folder.mkdir(parents=True, exist_ok=True)
self.app_context = app_context
self.input_name_image = "image"
self.output_name_seg = "seg_image"
self.output_name_saved_images_folder = "saved_images_folder"
# The base class has an attribute called fragment to hold the reference to the fragment object
super().__init__(fragment, *args, **kwargs)
def setup(self, spec: OperatorSpec):
spec.input(self.input_name_image)
spec.output(self.output_name_seg)
spec.output(self.output_name_saved_images_folder).condition(
ConditionType.NONE
) # Output not requiring a receiver
def compute(self, op_input, op_output, context):
input_image = op_input.receive(self.input_name_image)
if not input_image:
raise ValueError("Input image is not found.")
# This operator gets an in-memory Image object, so a specialized ImageReader is needed.
_reader = InMemImageReader(input_image)
pre_transforms = self.pre_process(_reader, str(self.output_folder))
post_transforms = self.post_process(pre_transforms, str(self.output_folder))
# Delegates inference and saving output to the built-in operator.
infer_operator = MonaiSegInferenceOperator(
self.fragment,
roi_size=(
96,
96,
96,
),
pre_transforms=pre_transforms,
post_transforms=post_transforms,
overlap=0.6,
app_context=self.app_context,
model_name="",
inferer=InfererType.SLIDING_WINDOW,
sw_batch_size=4,
model_path=self.model_path,
name="monai_seg_inference_op",
)
# Setting the keys used in the dictionary based transforms may change.
infer_operator.input_dataset_key = self._input_dataset_key
infer_operator.pred_dataset_key = self._pred_dataset_key
# Now emit data to the output ports of this operator
op_output.emit(infer_operator.compute_impl(input_image, context), self.output_name_seg)
op_output.emit(self.output_folder, self.output_name_saved_images_folder)
def pre_process(self, img_reader, out_dir: str = "./input_images") -> Compose:
"""Composes transforms for preprocessing input before predicting on a model."""
Path(out_dir).mkdir(parents=True, exist_ok=True)
my_key = self._input_dataset_key
return Compose(
[
LoadImaged(keys=my_key, reader=img_reader),
EnsureChannelFirstd(keys=my_key),
# The SaveImaged transform can be commented out to save 5 seconds.
# Uncompress NIfTI file, nii, is used favoring speed over size, but can be changed to nii.gz
SaveImaged(
keys=my_key,
output_dir=out_dir,
output_postfix="",
resample=False,
output_ext=".nii",
),
Orientationd(keys=my_key, axcodes="RAS"),
Spacingd(keys=my_key, pixdim=[1.5, 1.5, 2.9], mode=["bilinear"]),
ScaleIntensityRanged(keys=my_key, a_min=-57, a_max=164, b_min=0.0, b_max=1.0, clip=True),
EnsureTyped(keys=my_key),
]
)
def post_process(self, pre_transforms: Compose, out_dir: str = "./prediction_output") -> Compose:
"""Composes transforms for postprocessing the prediction results."""
Path(out_dir).mkdir(parents=True, exist_ok=True)
pred_key = self._pred_dataset_key
return Compose(
[
Activationsd(keys=pred_key, softmax=True),
Invertd(
keys=pred_key,
transform=pre_transforms,
orig_keys=self._input_dataset_key,
nearest_interp=False,
to_tensor=True,
),
AsDiscreted(keys=pred_key, argmax=True),
# The SaveImaged transform can be commented out to save 5 seconds.
# Uncompress NIfTI file, nii, is used favoring speed over size, but can be changed to nii.gz
SaveImaged(
keys=pred_key,
output_dir=out_dir,
output_postfix="seg",
output_dtype=uint8,
resample=False,
output_ext=".nii",
),
]
)
Writing my_app/spleen_seg_operator.py
app.py#
%%writefile my_app/app.py
import logging
from pathlib import Path
from spleen_seg_operator import SpleenSegOperator
from pydicom.sr.codedict import codes # Required for setting SegmentDescription attributes.
from monai.deploy.conditions import CountCondition
from monai.deploy.core import AppContext, Application
from monai.deploy.operators.dicom_data_loader_operator import DICOMDataLoaderOperator
from monai.deploy.operators.dicom_seg_writer_operator import DICOMSegmentationWriterOperator, SegmentDescription
from monai.deploy.operators.dicom_series_selector_operator import DICOMSeriesSelectorOperator
from monai.deploy.operators.dicom_series_to_volume_operator import DICOMSeriesToVolumeOperator
from monai.deploy.operators.stl_conversion_operator import STLConversionOperator
class AISpleenSegApp(Application):
def __init__(self, *args, **kwargs):
"""Creates an application instance."""
super().__init__(*args, **kwargs)
self._logger = logging.getLogger("{}.{}".format(__name__, type(self).__name__))
def run(self, *args, **kwargs):
# This method calls the base class to run. Can be omitted if simply calling through.
self._logger.info(f"Begin {self.run.__name__}")
super().run(*args, **kwargs)
self._logger.info(f"End {self.run.__name__}")
def compose(self):
"""Creates the app specific operators and chain them up in the processing DAG."""
# Use Commandline options over environment variables to init context.
app_context = Application.init_app_context(self.argv)
self._logger.debug(f"Begin {self.compose.__name__}")
app_input_path = Path(app_context.input_path)
app_output_path = Path(app_context.output_path)
model_path = Path(app_context.model_path)
self._logger.info(f"App input and output path: {app_input_path}, {app_output_path}")
# instantiates the SDK built-in operator(s).
study_loader_op = DICOMDataLoaderOperator(
self, CountCondition(self, 1), input_folder=app_input_path, name="dcm_loader_op"
)
series_selector_op = DICOMSeriesSelectorOperator(self, rules=Sample_Rules_Text, name="series_selector_op")
series_to_vol_op = DICOMSeriesToVolumeOperator(self, name="series_to_vol_op")
# Model specific inference operator, supporting MONAI transforms.
spleen_seg_op = SpleenSegOperator(self, app_context=app_context, model_path=model_path, name="seg_op")
# Create DICOM Seg writer providing the required segment description for each segment with
# the actual algorithm and the pertinent organ/tissue.
# The segment_label, algorithm_name, and algorithm_version are limited to 64 chars.
# https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_6.2.html
# User can Look up SNOMED CT codes at, e.g.
# https://bioportal.bioontology.org/ontologies/SNOMEDCT
_algorithm_name = "3D segmentation of the Spleen from a CT series"
_algorithm_family = codes.DCM.ArtificialIntelligence
_algorithm_version = "0.1.0"
segment_descriptions = [
SegmentDescription(
segment_label="Spleen",
segmented_property_category=codes.SCT.Organ,
segmented_property_type=codes.SCT.Spleen,
algorithm_name=_algorithm_name,
algorithm_family=_algorithm_family,
algorithm_version=_algorithm_version,
),
]
custom_tags = {"SeriesDescription": "AI generated Seg, not for clinical use."}
dicom_seg_writer = DICOMSegmentationWriterOperator(
self,
segment_descriptions=segment_descriptions,
custom_tags=custom_tags,
output_folder=app_output_path,
name="dcm_seg_writer_op",
)
# Create the processing pipeline, by specifying the source and destination operators, and
# ensuring the output from the former matches the input of the latter, in both name and type.
self.add_flow(study_loader_op, series_selector_op, {("dicom_study_list", "dicom_study_list")})
self.add_flow(
series_selector_op, series_to_vol_op, {("study_selected_series_list", "study_selected_series_list")}
)
self.add_flow(series_to_vol_op, spleen_seg_op, {("image", "image")})
# Note below the dicom_seg_writer requires two inputs, each coming from a source operator.
self.add_flow(
series_selector_op, dicom_seg_writer, {("study_selected_series_list", "study_selected_series_list")}
)
self.add_flow(spleen_seg_op, dicom_seg_writer, {("seg_image", "seg_image")})
self._logger.debug(f"End {self.compose.__name__}")
# This is a sample series selection rule in JSON, simply selecting CT series.
# If the study has more than 1 CT series, then all of them will be selected.
# Please see more detail in DICOMSeriesSelectorOperator.
# For list of string values, e.g. "ImageType": ["PRIMARY", "ORIGINAL"], it is a match if all elements
# are all in the multi-value attribute of the DICOM series.
Sample_Rules_Text = """
{
"selections": [
{
"name": "CT Series",
"conditions": {
"StudyDescription": "(.*?)",
"Modality": "(?i)CT",
"SeriesDescription": "(.*?)",
"ImageType": ["PRIMARY", "ORIGINAL"]
}
}
]
}
"""
if __name__ == "__main__":
# Creates the app and test it standalone.
AISpleenSegApp().run()
Writing my_app/app.py
if __name__ == "__main__":
AISpleenSegApp().run()
The above lines are needed to execute the application code by using python interpreter.
__main__.py#
__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).
%%writefile my_app/__main__.py
from app import AISpleenSegApp
if __name__ == "__main__":
AISpleenSegApp().run()
Writing my_app/__main__.py
!ls my_app
app.py __main__.py spleen_seg_operator.py
In this time, let’s execute the app in the command line.
Note
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.
!rm -rf $HOLOSCAN_OUTPUT_PATH
!python my_app
/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.
import pkg_resources
[info] [fragment.cpp:969] Loading extensions from configs...
[2025-10-30 12:10:18,978] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=['my_app'])
[2025-10-30 12:10:18,980] [INFO] (root) - AppContext object: AppContext(input_path=dcm, output_path=output, model_path=models, workdir=), triton_server_netloc=
[2025-10-30 12:10:18,980] [INFO] (app.AISpleenSegApp) - App input and output path: dcm, output
[info] [gxf_executor.cpp:344] Creating context
[info] [gxf_executor.cpp:2508] Activating Graph...
[info] [gxf_executor.cpp:2579] Running Graph...
[info] [gxf_executor.cpp:2581] Waiting for completion...
[info] [greedy_scheduler.cpp:191] Scheduling 5 entities
[2025-10-30 12:10:19,108] [INFO] (monai.deploy.operators.dicom_data_loader_operator.DICOMDataLoaderOperator) - No or invalid input path from the optional input port: None
[2025-10-30 12:10:19,429] [INFO] (root) - Finding series for Selection named: CT Series
[2025-10-30 12:10:19,429] [INFO] (root) - Searching study, : 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291
# of series: 1
[2025-10-30 12:10:19,429] [INFO] (root) - Working on series, instance UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239
[2025-10-30 12:10:19,429] [INFO] (root) - On attribute: 'StudyDescription' to match value: '(.*?)'
[2025-10-30 12:10:19,429] [INFO] (root) - Series attribute StudyDescription value: CT ABDOMEN W IV CONTRAST
[2025-10-30 12:10:19,429] [INFO] (root) - On attribute: 'Modality' to match value: '(?i)CT'
[2025-10-30 12:10:19,429] [INFO] (root) - Series attribute Modality value: CT
[2025-10-30 12:10:19,429] [INFO] (root) - On attribute: 'SeriesDescription' to match value: '(.*?)'
[2025-10-30 12:10:19,429] [INFO] (root) - Series attribute SeriesDescription value: ABD/PANC 3.0 B31f
[2025-10-30 12:10:19,429] [INFO] (root) - On attribute: 'ImageType' to match value: ['PRIMARY', 'ORIGINAL']
[2025-10-30 12:10:19,430] [INFO] (root) - Series attribute ImageType value: None
[2025-10-30 12:10:19,430] [INFO] (root) - Instance level attribute ImageType value: ["['ORIGINAL', 'PRIMARY', 'AXIAL', 'CT_SOM5 SPI']"]
[2025-10-30 12:10:19,430] [INFO] (root) - Selected Series, UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239
[2025-10-30 12:10:19,430] [INFO] (root) - Series Selection finalized
[2025-10-30 12:10:19,430] [INFO] (root) - Series Description of selected DICOM Series for inference: ABD/PANC 3.0 B31f
[2025-10-30 12:10:19,430] [INFO] (root) - Series Instance UID of selected DICOM Series for inference: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239
/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.
warn_deprecated(argname, msg, warning_category)
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Converted Image object metadata:
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesInstanceUID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239, type <class 'str'>
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesDate: 20090831, type <class 'str'>
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesTime: 101721.452, type <class 'str'>
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Modality: CT, type <class 'str'>
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesDescription: ABD/PANC 3.0 B31f, type <class 'str'>
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - PatientPosition: HFS, type <class 'str'>
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesNumber: 8, type <class 'int'>
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - row_pixel_spacing: 0.7890625, type <class 'float'>
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - col_pixel_spacing: 0.7890625, type <class 'float'>
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - depth_pixel_spacing: 1.5, type <class 'float'>
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - row_direction_cosine: [1.0, 0.0, 0.0], type <class 'list'>
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - col_direction_cosine: [0.0, 1.0, 0.0], type <class 'list'>
[2025-10-30 12:10:19,992] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - depth_direction_cosine: [0.0, 0.0, 1.0], type <class 'list'>
[2025-10-30 12:10:19,993] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - dicom_affine_transform: [[ 0.7890625 0. 0. -197.60547 ]
[ 0. 0.7890625 0. -398.60547 ]
[ 0. 0. 1.5 -383. ]
[ 0. 0. 0. 1. ]], type <class 'numpy.ndarray'>
[2025-10-30 12:10:19,993] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - nifti_affine_transform: [[ -0.7890625 -0. -0. 197.60547 ]
[ -0. -0.7890625 -0. 398.60547 ]
[ 0. 0. 1.5 -383. ]
[ 0. 0. 0. 1. ]], type <class 'numpy.ndarray'>
[2025-10-30 12:10:19,993] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyInstanceUID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291, type <class 'str'>
[2025-10-30 12:10:19,993] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyID: , type <class 'str'>
[2025-10-30 12:10:19,993] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyDate: 20090831, type <class 'str'>
[2025-10-30 12:10:19,993] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyTime: 095948.599, type <class 'str'>
[2025-10-30 12:10:19,993] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyDescription: CT ABDOMEN W IV CONTRAST, type <class 'str'>
[2025-10-30 12:10:19,993] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - AccessionNumber: 5471978513296937, type <class 'str'>
[2025-10-30 12:10:19,993] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - selection_name: CT Series, type <class 'str'>
[2025-10-30 12:10:19,993] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - affine: [[ -0.7890625 -0. -0. 197.60547 ]
[ -0. -0.7890625 -0. 398.60547 ]
[ 0. 0. 1.5 -383. ]
[ 0. 0. 0. 1. ]], type <class 'numpy.ndarray'>
[2025-10-30 12:10:19,993] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - space: RAS, type <class 'str'>
2025-10-30 12:10:20,794 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
[2025-10-30 12:10:22,562] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Input of <class 'monai.data.meta_tensor.MetaTensor'> shape: torch.Size([1, 1, 270, 270, 106])
/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:345.)
win_data = torch.cat([inputs[win_slice] for win_slice in unravel_slice]).to(sw_device)
/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:345.)
out[idx_zm] += p
2025-10-30 12:10:23,584 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
[2025-10-30 12:10:25,013] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform length/batch size of output: 1
[2025-10-30 12:10:25,014] [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)
[2025-10-30 12:10:25,139] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform pred of <class 'numpy.ndarray'> shape: (1, 512, 512, 204)
[2025-10-30 12:10:25,175] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Output Seg image numpy array of type <class 'numpy.ndarray'> shape: (204, 512, 512)
[2025-10-30 12:10:25,180] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Output Seg image pixel max value: 1
/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.
check_person_name(patient_name)
[2025-10-30 12:10:26,311] [INFO] (highdicom.base) - copy Image-related attributes from dataset "1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191"
[2025-10-30 12:10:26,311] [INFO] (highdicom.base) - copy attributes of module "Specimen"
[2025-10-30 12:10:26,311] [INFO] (highdicom.base) - copy Patient-related attributes from dataset "1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191"
[2025-10-30 12:10:26,311] [INFO] (highdicom.base) - copy attributes of module "Patient"
[2025-10-30 12:10:26,312] [INFO] (highdicom.base) - copy attributes of module "Clinical Trial Subject"
[2025-10-30 12:10:26,312] [INFO] (highdicom.base) - copy Study-related attributes from dataset "1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191"
[2025-10-30 12:10:26,312] [INFO] (highdicom.base) - copy attributes of module "General Study"
[2025-10-30 12:10:26,312] [INFO] (highdicom.base) - copy attributes of module "Patient Study"
[2025-10-30 12:10:26,313] [INFO] (highdicom.base) - copy attributes of module "Clinical Trial Study"
[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.
[info] [greedy_scheduler.cpp:401] Scheduler finished.
[info] [gxf_executor.cpp:2588] Deactivating Graph...
[info] [gxf_executor.cpp:2597] Graph execution finished.
[2025-10-30 12:10:26,411] [INFO] (app.AISpleenSegApp) - End run
[info] [gxf_executor.cpp:379] Destroying context
!ls -R $HOLOSCAN_OUTPUT_PATH
output:
1.2.826.0.1.3680043.10.511.3.83688787597818986137093182993481694.dcm
saved_images_folder
output/saved_images_folder:
1.3.6.1.4.1.14519.5.2.1.7085.2626
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
1.3.6.1.4.1.14519.5.2.1.7085.2626_seg.nii
Packaging app#
Let’s package the app with MONAI Application Packager.
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.
%%writefile my_app/app.yaml
%YAML 1.2
---
application:
title: MONAI Deploy App Package - MONAI Bundle AI App
version: 1.0
inputFormats: ["file"]
outputFormats: ["file"]
resources:
cpu: 1
gpu: 1
memory: 1Gi
gpuMemory: 6Gi
Writing my_app/app.yaml
%%writefile my_app/requirements.txt
highdicom>=0.18.2
monai>=1.0
nibabel>=3.2.1
numpy>=1.21.6
pydicom>=2.3.0
setuptools>=59.5.0 # for pkg_resources
SimpleITK>=2.0.0
torch>=1.12.0
Writing my_app/requirements.txt
Now we can use the CLI package command to build the MONAI Application Package (MAP) container image based on a supported base image.
Note
Building a MONAI Application Package (Docker image) can take time. Use -l DEBUG option to see the progress.
tag_prefix = "my_app"
!monai-deploy package my_app -m {models_folder} -c my_app/app.yaml -t {tag_prefix}:1.0 --platform x86_64 -l DEBUG
[2025-10-30 12:10:28,398] [INFO] (common) - Downloading CLI manifest file from https://raw.githubusercontent.com/nvidia-holoscan/holoscan-cli/refs/heads/main/releases/3.7.0/artifacts.json...
[2025-10-30 12:10:28,616] [DEBUG] (common) - Validating CLI manifest file...
[2025-10-30 12:10:28,617] [INFO] (packager.parameters) - Application: /home/mqin/src/md-app-sdk/notebooks/tutorials/my_app
[2025-10-30 12:10:28,618] [INFO] (packager.parameters) - Detected application type: Python Module
[2025-10-30 12:10:28,618] [INFO] (packager) - Scanning for models in /home/mqin/src/md-app-sdk/notebooks/tutorials/models...
[2025-10-30 12:10:28,619] [DEBUG] (packager) - Model model=/home/mqin/src/md-app-sdk/notebooks/tutorials/models/model added.
[2025-10-30 12:10:28,619] [INFO] (packager) - Reading application configuration from /home/mqin/src/md-app-sdk/notebooks/tutorials/my_app/app.yaml...
[2025-10-30 12:10:28,622] [INFO] (packager) - Generating app.json...
[2025-10-30 12:10:28,622] [INFO] (packager) - Generating pkg.json...
[2025-10-30 12:10:28,690] [DEBUG] (common) -
=============== Begin app.json ===============
{
"apiVersion": "1.0.0",
"command": "[\"python3\", \"/opt/holoscan/app\"]",
"environment": {
"HOLOSCAN_APPLICATION": "/opt/holoscan/app",
"HOLOSCAN_INPUT_PATH": "input/",
"HOLOSCAN_OUTPUT_PATH": "output/",
"HOLOSCAN_WORKDIR": "/var/holoscan",
"HOLOSCAN_MODEL_PATH": "/opt/holoscan/models",
"HOLOSCAN_CONFIG_PATH": "/var/holoscan/app.yaml",
"HOLOSCAN_APP_MANIFEST_PATH": "/etc/holoscan/app.json",
"HOLOSCAN_PKG_MANIFEST_PATH": "/etc/holoscan/pkg.json",
"HOLOSCAN_DOCS_PATH": "/opt/holoscan/docs",
"HOLOSCAN_LOGS_PATH": "/var/holoscan/logs"
},
"input": {
"path": "input/",
"formats": null
},
"liveness": null,
"output": {
"path": "output/",
"formats": null
},
"readiness": null,
"sdk": "monai-deploy",
"sdkVersion": "1.0.0",
"timeout": 0,
"version": 1.0,
"workingDirectory": "/var/holoscan"
}
================ End app.json ================
[2025-10-30 12:10:28,691] [DEBUG] (common) -
=============== Begin pkg.json ===============
{
"apiVersion": "1.0.0",
"applicationRoot": "/opt/holoscan/app",
"modelRoot": "/opt/holoscan/models",
"models": {
"model": "/opt/holoscan/models/model"
},
"resources": {
"cpu": 1,
"gpu": 1,
"memory": "1Gi",
"gpuMemory": "6Gi"
},
"version": 1.0,
"platformConfig": "dgpu"
}
================ End pkg.json ================
[2025-10-30 12:10:28,706] [DEBUG] (packager.builder) - ================ Begin requirements.txt ================
[2025-10-30 12:10:28,706] [DEBUG] (packager.builder) - highdicom>=0.18.2
[2025-10-30 12:10:28,706] [DEBUG] (packager.builder) - monai>=1.0
[2025-10-30 12:10:28,706] [DEBUG] (packager.builder) - nibabel>=3.2.1
[2025-10-30 12:10:28,706] [DEBUG] (packager.builder) - numpy>=1.21.6
[2025-10-30 12:10:28,706] [DEBUG] (packager.builder) - pydicom>=2.3.0
[2025-10-30 12:10:28,706] [DEBUG] (packager.builder) - setuptools>=59.5.0 # for pkg_resources
[2025-10-30 12:10:28,707] [DEBUG] (packager.builder) - SimpleITK>=2.0.0
[2025-10-30 12:10:28,707] [DEBUG] (packager.builder) - torch>=1.12.0
[2025-10-30 12:10:28,707] [DEBUG] (packager.builder) -
[2025-10-30 12:10:28,707] [DEBUG] (packager.builder) - ================ End requirements.txt ==================
[2025-10-30 12:10:28,707] [DEBUG] (packager.builder) -
========== Begin Build Parameters ==========
{'add_hosts': None,
'additional_lib_paths': '',
'app_config_file_path': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/my_app/app.yaml'),
'app_dir': PosixPath('/opt/holoscan/app'),
'app_json': '/etc/holoscan/app.json',
'application': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/my_app'),
'application_directory': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/my_app'),
'application_type': 'PythonModule',
'build_cache': PosixPath('/home/mqin/.holoscan_build_cache'),
'cmake_args': '',
'command': '["python3", "/opt/holoscan/app"]',
'command_filename': 'my_app',
'config_file_path': PosixPath('/var/holoscan/app.yaml'),
'docs_dir': PosixPath('/opt/holoscan/docs'),
'full_input_path': PosixPath('/var/holoscan/input'),
'full_output_path': PosixPath('/var/holoscan/output'),
'gid': 1000,
'holoscan_sdk_version': '3.7.0',
'includes': [],
'input_data': None,
'input_dir': 'input/',
'lib_dir': PosixPath('/opt/holoscan/lib'),
'logs_dir': PosixPath('/var/holoscan/logs'),
'models': {'model': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/models/model')},
'models_dir': PosixPath('/opt/holoscan/models'),
'monai_deploy_app_sdk_version': '1.0.0',
'no_cache': False,
'output_dir': 'output/',
'pip_packages': None,
'pkg_json': '/etc/holoscan/pkg.json',
'requirements_file_path': PosixPath('/home/mqin/src/md-app-sdk/notebooks/tutorials/my_app/requirements.txt'),
'sdk': <SdkType.MonaiDeploy: 'monai-deploy'>,
'sdk_type': 'monai-deploy',
'tarball_output': None,
'timeout': 0,
'title': 'MONAI Deploy App Package - MONAI Bundle AI App',
'uid': 1000,
'username': 'holoscan',
'version': 1.0,
'working_dir': PosixPath('/var/holoscan')}
=========== End Build Parameters ===========
[2025-10-30 12:10:28,707] [DEBUG] (packager.builder) -
========== Begin Platform Parameters ==========
{'base_image': 'nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04',
'build_image': None,
'cuda_deb_arch': 'x86_64',
'cuda_version': 13,
'custom_base_image': False,
'custom_holoscan_sdk': False,
'custom_monai_deploy_sdk': True,
'gpu_type': 'dgpu',
'holoscan_deb_arch': 'amd64',
'holoscan_sdk_file': '3.7.0',
'holoscan_sdk_filename': '3.7.0',
'monai_deploy_sdk_file': PosixPath('/home/mqin/src/md-app-sdk/dist/monai_deploy_app_sdk-1.0.0+48.gfd5999e.dirty-py3-none-any.whl'),
'monai_deploy_sdk_filename': 'monai_deploy_app_sdk-1.0.0+48.gfd5999e.dirty-py3-none-any.whl',
'tag': 'my_app:1.0',
'target_arch': 'x86_64'}
=========== End Platform Parameters ===========
[2025-10-30 12:10:28,724] [DEBUG] (packager.builder) -
========== Begin Dockerfile ==========
# SPDX-FileCopyrightText: Copyright (c) 2023-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
ARG GPU_TYPE=dgpu
ARG LIBTORCH_VERSION_ARM64="2.9.0.dev20250828+cu130"
ARG LIBTORCH_VERSION_AMD64="2.9.0.dev20250829+cu130"
ARG LIBTORCH_VISION_VERSION="0.24.0.dev20250829"
FROM nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04 AS base
RUN apt-get update \
&& apt-get install -y --no-install-recommends --no-install-suggests \
curl \
jq \
&& rm -rf /var/lib/apt/lists/*
FROM base AS release
ENV DEBIAN_FRONTEND=noninteractive
ENV TERM=xterm-256color
ARG GPU_TYPE
ARG UNAME
ARG UID
ARG GID
ARG LIBTORCH_VERSION_ARM64
ARG LIBTORCH_VERSION_AMD64
ARG LIBTORCH_VISION_VERSION
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
LABEL base="nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04"
LABEL tag="my_app:1.0"
LABEL org.opencontainers.image.title="MONAI Deploy App Package - MONAI Bundle AI App"
LABEL org.opencontainers.image.version="1.0"
LABEL org.nvidia.holoscan="3.7.0"
LABEL org.monai.deploy.app-sdk="1.0.0"
ENV HOLOSCAN_INPUT_PATH=/var/holoscan/input
ENV HOLOSCAN_OUTPUT_PATH=/var/holoscan/output
ENV HOLOSCAN_WORKDIR=/var/holoscan
ENV HOLOSCAN_APPLICATION=/opt/holoscan/app
ENV HOLOSCAN_TIMEOUT=0
ENV HOLOSCAN_MODEL_PATH=/opt/holoscan/models
ENV HOLOSCAN_DOCS_PATH=/opt/holoscan/docs
ENV HOLOSCAN_CONFIG_PATH=/var/holoscan/app.yaml
ENV HOLOSCAN_APP_MANIFEST_PATH=/etc/holoscan/app.json
ENV HOLOSCAN_PKG_MANIFEST_PATH=/etc/holoscan/pkg.json
ENV HOLOSCAN_LOGS_PATH=/var/holoscan/logs
ENV HOLOSCAN_VERSION=3.7.0
# Update NV GPG repo key
# https://developer.nvidia.com/blog/updating-the-cuda-linux-gpg-repository-key/
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
# If torch is installed, we can skip installing Python
ENV PYTHON_VERSION=3.12.3-*
ENV PYTHON_PIP_VERSION=24.0+dfsg-*
RUN apt update \
&& apt-get install -y --no-install-recommends --no-install-suggests \
python3-minimal=${PYTHON_VERSION} \
libpython3-stdlib=${PYTHON_VERSION} \
python3=${PYTHON_VERSION} \
python3-venv=${PYTHON_VERSION} \
python3-pip=${PYTHON_PIP_VERSION} \
&& rm -rf /var/lib/apt/lists/*
RUN if id "ubuntu" >/dev/null 2>&1; then touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu; fi
RUN groupadd -f -g $GID $UNAME
RUN useradd -rm -d /home/$UNAME -s /bin/bash -g $GID -G sudo -u $UID $UNAME
RUN chown -R holoscan /var/holoscan && \
chown -R holoscan /var/holoscan/input && \
chown -R holoscan /var/holoscan/output
# Set the working directory
WORKDIR /var/holoscan
# Copy HAP/MAP tool script
COPY ./tools /var/holoscan/tools
RUN chmod +x /var/holoscan/tools
# Remove EXTERNALLY-MANAGED directory
RUN rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED
# Set the working directory
WORKDIR /var/holoscan
USER $UNAME
ENV PATH=/home/${UNAME}/.local/bin:/opt/nvidia/holoscan/bin:$PATH
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/${UNAME}/.local/lib/python3.12/site-packages/holoscan/lib
COPY ./pip/requirements.txt /tmp/requirements.txt
RUN pip install --upgrade pip
RUN pip install --no-cache-dir --user -r /tmp/requirements.txt
# Install MONAI Deploy App SDK
# Copy user-specified MONAI Deploy SDK file
COPY ./monai_deploy_app_sdk-1.0.0+48.gfd5999e.dirty-py3-none-any.whl /tmp/monai_deploy_app_sdk-1.0.0+48.gfd5999e.dirty-py3-none-any.whl
RUN pip install /tmp/monai_deploy_app_sdk-1.0.0+48.gfd5999e.dirty-py3-none-any.whl
COPY ./models /opt/holoscan/models
COPY ./map/app.json /etc/holoscan/app.json
COPY ./app.config /var/holoscan/app.yaml
COPY ./map/pkg.json /etc/holoscan/pkg.json
COPY ./app /opt/holoscan/app
ENTRYPOINT ["/var/holoscan/tools"]
=========== End Dockerfile ===========
[2025-10-30 12:10:29,052] [INFO] (common) - Using existing Docker BuildKit builder `holoscan_app_builder`
[2025-10-30 12:10:29,052] [DEBUG] (packager.builder) - Building Holoscan Application Package: tag=my_app-x64-workstation-dgpu-linux-amd64:1.0
[2025-10-30 12:10:29,053] [INFO] (packager.builder) -
===============================================================================
Building image for: x64-workstation
Architecture: linux/amd64
Base Image: nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04
Build Image: N/A
CUDA Version: 13
Cache: Enabled
Configuration: dgpu
Holoscan SDK Package: 3.7.0
MONAI Deploy App SDK Package: /home/mqin/src/md-app-sdk/dist/monai_deploy_app_sdk-1.0.0+48.gfd5999e.dirty-py3-none-any.whl
gRPC Health Probe: N/A
SDK Version: 3.7.0
SDK: monai-deploy
Tag: my_app-x64-workstation-dgpu-linux-amd64:1.0
Included features/dependencies: N/A
#0 building with "holoscan_app_builder" instance using docker-container driver
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 4.70kB done
#1 DONE 0.1s
#2 [auth] nvidia/cuda:pull token for nvcr.io
#2 DONE 0.0s
#3 [internal] load metadata for nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04
#3 DONE 0.8s
#4 [internal] load .dockerignore
#4 transferring context: 1.80kB done
#4 DONE 0.1s
#5 importing cache manifest from nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04
#5 ...
#6 [internal] load build context
#6 DONE 0.0s
#7 importing cache manifest from local:10832056283413565963
#7 inferred cache manifest type: application/vnd.oci.image.index.v1+json done
#7 DONE 0.0s
#8 [base 1/2] FROM nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04@sha256:95318efecfd68ab3d109da5277863257b06137c84f34a87f38de970d5cd035d3
#8 resolve nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04@sha256:95318efecfd68ab3d109da5277863257b06137c84f34a87f38de970d5cd035d3 0.0s done
#8 DONE 0.1s
#5 importing cache manifest from nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04
#5 inferred cache manifest type: application/vnd.docker.distribution.manifest.list.v2+json done
#5 DONE 0.3s
#6 [internal] load build context
#6 transferring context: 19.58MB 0.1s done
#6 DONE 0.3s
#8 [base 1/2] FROM nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04@sha256:95318efecfd68ab3d109da5277863257b06137c84f34a87f38de970d5cd035d3
#8 DONE 0.5s
#8 [base 1/2] FROM nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04@sha256:95318efecfd68ab3d109da5277863257b06137c84f34a87f38de970d5cd035d3
#8 sha256:932162d4fcf6e1094ee1544e8fde0ae2a02b2c4e9545f64f373ce3a4479189e6 1.52kB / 1.52kB 0.2s
#8 sha256:932162d4fcf6e1094ee1544e8fde0ae2a02b2c4e9545f64f373ce3a4479189e6 1.52kB / 1.52kB 0.2s done
#8 sha256:492db7b3e492442f7a1ad30fea534f61ad89da451c675ccab2488e41034d0886 1.68kB / 1.68kB 0.2s done
#8 sha256:84fef9f1ca4f21e9c7411db3c57fe91a1f401d7051d87a3bfed97ff70a2cf72c 59.61kB / 59.61kB 0.2s done
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 1.05MB / 1.51GB 0.2s
#8 sha256:13e8f87efde86df96bfe73da211eb196d0416702b69d92947ec617138e6db64b 6.88kB / 6.88kB 0.1s done
#8 sha256:ddc61996788ff6833bbe82138d6fc5000e848953b90df5055cbae21479218914 186B / 186B 0.1s done
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 4.19MB / 105.07MB 0.2s
#8 sha256:9c9b39ad83d512d5af47e9c22f4458cb586f05ea478656a372c5e739cb7280e5 1.05MB / 4.55MB 0.2s
#8 sha256:32f112e3802cadcab3543160f4d2aa607b3cc1c62140d57b4f5441384f40e927 1.05MB / 29.72MB 0.2s
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 13.63MB / 105.07MB 0.5s
#8 sha256:9c9b39ad83d512d5af47e9c22f4458cb586f05ea478656a372c5e739cb7280e5 2.10MB / 4.55MB 0.3s
#8 sha256:32f112e3802cadcab3543160f4d2aa607b3cc1c62140d57b4f5441384f40e927 5.24MB / 29.72MB 0.3s
#8 sha256:9c9b39ad83d512d5af47e9c22f4458cb586f05ea478656a372c5e739cb7280e5 4.55MB / 4.55MB 0.4s done
#8 sha256:32f112e3802cadcab3543160f4d2aa607b3cc1c62140d57b4f5441384f40e927 9.44MB / 29.72MB 0.5s
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 23.13MB / 105.07MB 0.8s
#8 sha256:32f112e3802cadcab3543160f4d2aa607b3cc1c62140d57b4f5441384f40e927 14.68MB / 29.72MB 0.6s
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 29.36MB / 105.07MB 0.9s
#8 sha256:32f112e3802cadcab3543160f4d2aa607b3cc1c62140d57b4f5441384f40e927 22.02MB / 29.72MB 0.8s
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 35.65MB / 105.07MB 1.1s
#8 sha256:32f112e3802cadcab3543160f4d2aa607b3cc1c62140d57b4f5441384f40e927 27.31MB / 29.72MB 0.9s
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 44.04MB / 105.07MB 1.2s
#8 sha256:32f112e3802cadcab3543160f4d2aa607b3cc1c62140d57b4f5441384f40e927 29.72MB / 29.72MB 1.0s done
#8 extracting sha256:32f112e3802cadcab3543160f4d2aa607b3cc1c62140d57b4f5441384f40e927
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 51.38MB / 105.07MB 1.4s
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 58.72MB / 105.07MB 1.5s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 81.79MB / 1.51GB 1.7s
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 66.06MB / 105.07MB 1.7s
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 73.40MB / 105.07MB 1.8s
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 80.74MB / 105.07MB 2.0s
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 88.08MB / 105.07MB 2.1s
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 95.42MB / 105.07MB 2.3s
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 103.19MB / 105.07MB 2.4s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 165.68MB / 1.51GB 2.9s
#8 sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 105.07MB / 105.07MB 3.2s done
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 251.66MB / 1.51GB 3.6s
#8 extracting sha256:32f112e3802cadcab3543160f4d2aa607b3cc1c62140d57b4f5441384f40e927 2.4s done
#8 extracting sha256:9c9b39ad83d512d5af47e9c22f4458cb586f05ea478656a372c5e739cb7280e5
#8 extracting sha256:9c9b39ad83d512d5af47e9c22f4458cb586f05ea478656a372c5e739cb7280e5 0.4s done
#8 extracting sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 338.69MB / 1.51GB 4.4s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 424.67MB / 1.51GB 5.1s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 511.71MB / 1.51GB 5.9s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 598.33MB / 1.51GB 6.6s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 684.72MB / 1.51GB 7.4s
#8 extracting sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 3.8s done
#8 extracting sha256:ddc61996788ff6833bbe82138d6fc5000e848953b90df5055cbae21479218914 0.0s done
#8 extracting sha256:13e8f87efde86df96bfe73da211eb196d0416702b69d92947ec617138e6db64b 0.0s done
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 771.75MB / 1.51GB 8.1s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 858.78MB / 1.51GB 8.9s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 947.91MB / 1.51GB 9.6s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 1.02GB / 1.51GB 10.4s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 1.11GB / 1.51GB 11.3s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 1.19GB / 1.51GB 12.0s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 1.27GB / 1.51GB 12.8s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 1.36GB / 1.51GB 13.7s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 1.44GB / 1.51GB 14.6s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 1.51GB / 1.51GB 19.7s
#8 sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 1.51GB / 1.51GB 21.6s done
#8 extracting sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338
#8 extracting sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 24.3s done
#8 DONE 46.6s
#8 [base 1/2] FROM nvcr.io/nvidia/cuda:13.0.0-runtime-ubuntu24.04@sha256:95318efecfd68ab3d109da5277863257b06137c84f34a87f38de970d5cd035d3
#8 extracting sha256:84fef9f1ca4f21e9c7411db3c57fe91a1f401d7051d87a3bfed97ff70a2cf72c 0.0s done
#8 extracting sha256:492db7b3e492442f7a1ad30fea534f61ad89da451c675ccab2488e41034d0886 0.0s done
#8 extracting sha256:932162d4fcf6e1094ee1544e8fde0ae2a02b2c4e9545f64f373ce3a4479189e6 0.0s done
#8 DONE 46.7s
#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/*
#9 0.381 Get:1 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 InRelease [1581 B]
#9 0.567 Get:2 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
#9 0.574 Get:3 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
#9 0.906 Get:4 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 Packages [966 kB]
#9 1.302 Get:5 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
#9 1.336 Get:6 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [1170 kB]
#9 1.484 Get:7 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]
#9 1.674 Get:8 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]
#9 1.802 Get:9 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]
#9 1.850 Get:10 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]
#9 1.985 Get:11 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [1599 kB]
#9 2.148 Get:12 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Packages [33.1 kB]
#9 2.150 Get:13 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [2638 kB]
#9 3.407 Get:14 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1808 kB]
#9 3.458 Get:15 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [2813 kB]
#9 3.595 Get:16 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [1988 kB]
#9 3.680 Get:17 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [1939 kB]
#9 3.760 Get:18 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Packages [35.9 kB]
#9 3.762 Get:19 http://archive.ubuntu.com/ubuntu noble-backports/main amd64 Packages [49.4 kB]
#9 3.763 Get:20 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [33.9 kB]
#9 4.526 Fetched 35.5 MB in 4s (8373 kB/s)
#9 4.526 Reading package lists...
#9 5.474 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.
#9 5.492 Reading package lists...
#9 6.479 Building dependency tree...
#9 6.710 Reading state information...
#9 7.035 The following additional packages will be installed:
#9 7.035 libbrotli1 libcurl4t64 libgssapi-krb5-2 libjq1 libk5crypto3 libkeyutils1
#9 7.036 libkrb5-3 libkrb5support0 libnghttp2-14 libonig5 libpsl5t64 librtmp1
#9 7.037 libssh-4
#9 7.039 Suggested packages:
#9 7.039 krb5-doc krb5-user
#9 7.039 Recommended packages:
#9 7.039 krb5-locales publicsuffix
#9 7.095 The following NEW packages will be installed:
#9 7.096 curl jq libbrotli1 libcurl4t64 libgssapi-krb5-2 libjq1 libk5crypto3
#9 7.097 libkeyutils1 libkrb5-3 libkrb5support0 libnghttp2-14 libonig5 libpsl5t64
#9 7.098 librtmp1 libssh-4
#9 7.459 0 upgraded, 15 newly installed, 0 to remove and 34 not upgraded.
#9 7.459 Need to get 2270 kB of archives.
#9 7.459 After this operation, 6343 kB of additional disk space will be used.
#9 7.459 Get:1 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libkrb5support0 amd64 1.20.1-6ubuntu2.6 [34.4 kB]
#9 7.461 Get:2 http://security.ubuntu.com/ubuntu noble-security/main amd64 libssh-4 amd64 0.10.6-2ubuntu0.2 [188 kB]
#9 7.816 Get:3 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libk5crypto3 amd64 1.20.1-6ubuntu2.6 [82.0 kB]
#9 8.063 Get:4 http://archive.ubuntu.com/ubuntu noble/main amd64 libkeyutils1 amd64 1.6.3-3build1 [9490 B]
#9 8.089 Get:5 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libkrb5-3 amd64 1.20.1-6ubuntu2.6 [348 kB]
#9 8.380 Get:6 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgssapi-krb5-2 amd64 1.20.1-6ubuntu2.6 [143 kB]
#9 8.429 Get:7 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libnghttp2-14 amd64 1.59.0-1ubuntu0.2 [74.3 kB]
#9 8.613 Get:8 http://archive.ubuntu.com/ubuntu noble/main amd64 libpsl5t64 amd64 0.21.2-1.1build1 [57.1 kB]
#9 8.615 Get:9 http://archive.ubuntu.com/ubuntu noble/main amd64 libbrotli1 amd64 1.1.0-2build2 [331 kB]
#9 8.654 Get:10 http://archive.ubuntu.com/ubuntu noble/main amd64 librtmp1 amd64 2.4+20151223.gitfa8646d.1-2build7 [56.3 kB]
#9 8.656 Get:11 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libcurl4t64 amd64 8.5.0-2ubuntu10.6 [341 kB]
#9 8.709 Get:12 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 curl amd64 8.5.0-2ubuntu10.6 [226 kB]
#9 9.023 Get:13 http://archive.ubuntu.com/ubuntu noble/main amd64 libonig5 amd64 6.9.9-1build1 [172 kB]
#9 9.720 Get:14 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libjq1 amd64 1.7.1-3ubuntu0.24.04.1 [141 kB]
#9 9.813 Get:15 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 jq amd64 1.7.1-3ubuntu0.24.04.1 [65.7 kB]
#9 10.98 debconf: delaying package configuration, since apt-utils is not installed
#9 11.05 Fetched 2270 kB in 3s (825 kB/s)
#9 11.12 Selecting previously unselected package libkrb5support0:amd64.
(Reading database ... 5321 files and directories currently installed.)
#9 11.15 Preparing to unpack .../00-libkrb5support0_1.20.1-6ubuntu2.6_amd64.deb ...
#9 11.17 Unpacking libkrb5support0:amd64 (1.20.1-6ubuntu2.6) ...
#9 11.24 Selecting previously unselected package libk5crypto3:amd64.
#9 11.24 Preparing to unpack .../01-libk5crypto3_1.20.1-6ubuntu2.6_amd64.deb ...
#9 11.25 Unpacking libk5crypto3:amd64 (1.20.1-6ubuntu2.6) ...
#9 11.30 Selecting previously unselected package libkeyutils1:amd64.
#9 11.30 Preparing to unpack .../02-libkeyutils1_1.6.3-3build1_amd64.deb ...
#9 11.30 Unpacking libkeyutils1:amd64 (1.6.3-3build1) ...
#9 11.36 Selecting previously unselected package libkrb5-3:amd64.
#9 11.37 Preparing to unpack .../03-libkrb5-3_1.20.1-6ubuntu2.6_amd64.deb ...
#9 11.37 Unpacking libkrb5-3:amd64 (1.20.1-6ubuntu2.6) ...
#9 11.50 Selecting previously unselected package libgssapi-krb5-2:amd64.
#9 11.51 Preparing to unpack .../04-libgssapi-krb5-2_1.20.1-6ubuntu2.6_amd64.deb ...
#9 11.52 Unpacking libgssapi-krb5-2:amd64 (1.20.1-6ubuntu2.6) ...
#9 11.61 Selecting previously unselected package libnghttp2-14:amd64.
#9 11.61 Preparing to unpack .../05-libnghttp2-14_1.59.0-1ubuntu0.2_amd64.deb ...
#9 11.63 Unpacking libnghttp2-14:amd64 (1.59.0-1ubuntu0.2) ...
#9 11.73 Selecting previously unselected package libpsl5t64:amd64.
#9 11.73 Preparing to unpack .../06-libpsl5t64_0.21.2-1.1build1_amd64.deb ...
#9 11.75 Unpacking libpsl5t64:amd64 (0.21.2-1.1build1) ...
#9 11.85 Selecting previously unselected package libbrotli1:amd64.
#9 11.85 Preparing to unpack .../07-libbrotli1_1.1.0-2build2_amd64.deb ...
#9 11.86 Unpacking libbrotli1:amd64 (1.1.0-2build2) ...
#9 11.98 Selecting previously unselected package librtmp1:amd64.
#9 11.99 Preparing to unpack .../08-librtmp1_2.4+20151223.gitfa8646d.1-2build7_amd64.deb ...
#9 12.00 Unpacking librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2build7) ...
#9 12.10 Selecting previously unselected package libssh-4:amd64.
#9 12.11 Preparing to unpack .../09-libssh-4_0.10.6-2ubuntu0.2_amd64.deb ...
#9 12.12 Unpacking libssh-4:amd64 (0.10.6-2ubuntu0.2) ...
#9 12.23 Selecting previously unselected package libcurl4t64:amd64.
#9 12.23 Preparing to unpack .../10-libcurl4t64_8.5.0-2ubuntu10.6_amd64.deb ...
#9 12.24 Unpacking libcurl4t64:amd64 (8.5.0-2ubuntu10.6) ...
#9 12.33 Selecting previously unselected package curl.
#9 12.33 Preparing to unpack .../11-curl_8.5.0-2ubuntu10.6_amd64.deb ...
#9 12.34 Unpacking curl (8.5.0-2ubuntu10.6) ...
#9 12.46 Selecting previously unselected package libonig5:amd64.
#9 12.47 Preparing to unpack .../12-libonig5_6.9.9-1build1_amd64.deb ...
#9 12.48 Unpacking libonig5:amd64 (6.9.9-1build1) ...
#9 12.59 Selecting previously unselected package libjq1:amd64.
#9 12.59 Preparing to unpack .../13-libjq1_1.7.1-3ubuntu0.24.04.1_amd64.deb ...
#9 12.60 Unpacking libjq1:amd64 (1.7.1-3ubuntu0.24.04.1) ...
#9 12.69 Selecting previously unselected package jq.
#9 12.69 Preparing to unpack .../14-jq_1.7.1-3ubuntu0.24.04.1_amd64.deb ...
#9 12.70 Unpacking jq (1.7.1-3ubuntu0.24.04.1) ...
#9 12.80 Setting up libkeyutils1:amd64 (1.6.3-3build1) ...
#9 12.84 Setting up libbrotli1:amd64 (1.1.0-2build2) ...
#9 12.88 Setting up libpsl5t64:amd64 (0.21.2-1.1build1) ...
#9 12.91 Setting up libnghttp2-14:amd64 (1.59.0-1ubuntu0.2) ...
#9 12.95 Setting up libkrb5support0:amd64 (1.20.1-6ubuntu2.6) ...
#9 12.99 Setting up librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2build7) ...
#9 13.02 Setting up libk5crypto3:amd64 (1.20.1-6ubuntu2.6) ...
#9 13.06 Setting up libkrb5-3:amd64 (1.20.1-6ubuntu2.6) ...
#9 13.10 Setting up libonig5:amd64 (6.9.9-1build1) ...
#9 13.13 Setting up libjq1:amd64 (1.7.1-3ubuntu0.24.04.1) ...
#9 13.17 Setting up libgssapi-krb5-2:amd64 (1.20.1-6ubuntu2.6) ...
#9 13.21 Setting up libssh-4:amd64 (0.10.6-2ubuntu0.2) ...
#9 13.24 Setting up jq (1.7.1-3ubuntu0.24.04.1) ...
#9 13.28 Setting up libcurl4t64:amd64 (8.5.0-2ubuntu10.6) ...
#9 13.32 Setting up curl (8.5.0-2ubuntu10.6) ...
#9 13.35 Processing triggers for libc-bin (2.39-0ubuntu8.5) ...
#9 DONE 15.2s
#10 [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
#10 DONE 0.2s
#11 [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
#11 0.208 % Total % Received % Xferd Average Speed Time Time Time Current
#11 0.208 Dload Upload Total Spent Left Speed
100 4328 100 4328 0 0 67934 0 --:--:-- --:--:-- --:--:-- 68698
#11 0.340 Selecting previously unselected package cuda-keyring.
#11 0.352 (Reading database ... 5425 files and directories currently installed.)
#11 0.353 Preparing to unpack cuda-keyring_1.1-1_all.deb ...
#11 0.365 Unpacking cuda-keyring (1.1-1) ...
#11 0.421 Setting up cuda-keyring (1.1-1) ...
#11 0.689 Get:1 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 InRelease [1581 B]
#11 0.761 Get:2 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
#11 0.838 Get:3 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 Packages [966 kB]
#11 0.918 Get:4 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
#11 1.166 Get:5 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
#11 1.267 Get:6 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]
#11 1.376 Get:7 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1808 kB]
#11 1.626 Get:8 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]
#11 1.630 Get:9 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]
#11 1.846 Get:10 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Packages [33.1 kB]
#11 2.010 Get:11 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [1170 kB]
#11 2.148 Get:12 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]
#11 2.155 Get:13 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [2813 kB]
#11 2.219 Get:14 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [1939 kB]
#11 2.271 Get:15 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [1988 kB]
#11 2.318 Get:16 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Packages [35.9 kB]
#11 2.319 Get:17 http://archive.ubuntu.com/ubuntu noble-backports/main amd64 Packages [49.4 kB]
#11 2.319 Get:18 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [33.9 kB]
#11 2.515 Get:19 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [1599 kB]
#11 2.681 Get:20 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [2638 kB]
#11 3.462 Fetched 35.5 MB in 3s (12.4 MB/s)
#11 3.462 Reading package lists...
#11 DONE 4.6s
#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/*
#12 0.183
#12 0.183 WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
#12 0.183
#12 0.313 Hit:1 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 InRelease
#12 0.410 Hit:2 http://security.ubuntu.com/ubuntu noble-security InRelease
#12 0.526 Hit:3 http://archive.ubuntu.com/ubuntu noble InRelease
#12 0.661 Hit:4 http://archive.ubuntu.com/ubuntu noble-updates InRelease
#12 0.805 Hit:5 http://archive.ubuntu.com/ubuntu noble-backports InRelease
#12 1.130 Reading package lists...
#12 2.067 Building dependency tree...
#12 2.283 Reading state information...
#12 2.314 34 packages can be upgraded. Run 'apt list --upgradable' to see them.
#12 2.332 Reading package lists...
#12 3.286 Building dependency tree...
#12 3.509 Reading state information...
#12 3.812 The following additional packages will be installed:
#12 3.814 libexpat1 libpython3.12-minimal libpython3.12-stdlib media-types netbase
#12 3.814 python3-pip-whl python3-pkg-resources python3-setuptools
#12 3.814 python3-setuptools-whl python3-wheel python3.12 python3.12-minimal
#12 3.814 python3.12-venv tzdata
#12 3.816 Suggested packages:
#12 3.816 python3-doc python3-tk python-setuptools-doc python3.12-doc binutils
#12 3.816 binfmt-support
#12 3.816 Recommended packages:
#12 3.816 build-essential python3-dev
#12 3.915 The following NEW packages will be installed:
#12 3.916 libexpat1 libpython3-stdlib libpython3.12-minimal libpython3.12-stdlib
#12 3.919 media-types netbase python3 python3-minimal python3-pip python3-pip-whl
#12 3.919 python3-pkg-resources python3-setuptools python3-setuptools-whl python3-venv
#12 3.919 python3-wheel python3.12 python3.12-minimal python3.12-venv tzdata
#12 4.234 0 upgraded, 19 newly installed, 0 to remove and 34 not upgraded.
#12 4.234 Need to get 10.7 MB of archives.
#12 4.234 After this operation, 38.7 MB of additional disk space will be used.
#12 4.234 Get:1 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpython3.12-minimal amd64 3.12.3-1ubuntu0.8 [836 kB]
#12 5.240 Get:2 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libexpat1 amd64 2.6.1-2ubuntu0.3 [88.0 kB]
#12 5.250 Get:3 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3.12-minimal amd64 3.12.3-1ubuntu0.8 [2334 kB]
#12 5.904 Get:4 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-minimal amd64 3.12.3-0ubuntu2 [27.4 kB]
#12 5.907 Get:5 http://archive.ubuntu.com/ubuntu noble/main amd64 media-types all 10.1.0 [27.5 kB]
#12 5.911 Get:6 http://archive.ubuntu.com/ubuntu noble/main amd64 netbase all 6.4 [13.1 kB]
#12 5.913 Get:7 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 tzdata all 2025b-0ubuntu0.24.04.1 [276 kB]
#12 5.933 Get:8 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpython3.12-stdlib amd64 3.12.3-1ubuntu0.8 [2068 kB]
#12 6.270 Get:9 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3.12 amd64 3.12.3-1ubuntu0.8 [651 kB]
#12 6.394 Get:10 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpython3-stdlib amd64 3.12.3-0ubuntu2 [10.0 kB]
#12 6.395 Get:11 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3 amd64 3.12.3-0ubuntu2 [23.0 kB]
#12 6.679 Get:12 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-pkg-resources all 68.1.2-2ubuntu1.2 [168 kB]
#12 7.383 Get:13 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-setuptools all 68.1.2-2ubuntu1.2 [397 kB]
#12 7.666 Get:14 http://archive.ubuntu.com/ubuntu noble/universe amd64 python3-wheel all 0.42.0-2 [53.1 kB]
#12 7.683 Get:15 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 python3-pip all 24.0+dfsg-1ubuntu1.3 [1320 kB]
#12 7.939 Get:16 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 python3-pip-whl all 24.0+dfsg-1ubuntu1.3 [1707 kB]
#12 8.069 Get:17 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 python3-setuptools-whl all 68.1.2-2ubuntu1.2 [716 kB]
#12 8.104 Get:18 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 python3.12-venv amd64 3.12.3-1ubuntu0.8 [5678 B]
#12 8.104 Get:19 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 python3-venv amd64 3.12.3-0ubuntu2 [1034 B]
#12 8.272 debconf: delaying package configuration, since apt-utils is not installed
#12 8.345 Fetched 10.7 MB in 4s (2575 kB/s)
#12 8.422 Selecting previously unselected package libpython3.12-minimal:amd64.
(Reading database ... 5430 files and directories currently installed.)
#12 8.439 Preparing to unpack .../libpython3.12-minimal_3.12.3-1ubuntu0.8_amd64.deb ...
#12 8.451 Unpacking libpython3.12-minimal:amd64 (3.12.3-1ubuntu0.8) ...
#12 8.619 Selecting previously unselected package libexpat1:amd64.
#12 8.622 Preparing to unpack .../libexpat1_2.6.1-2ubuntu0.3_amd64.deb ...
#12 8.646 Unpacking libexpat1:amd64 (2.6.1-2ubuntu0.3) ...
#12 8.758 Selecting previously unselected package python3.12-minimal.
#12 8.760 Preparing to unpack .../python3.12-minimal_3.12.3-1ubuntu0.8_amd64.deb ...
#12 8.780 Unpacking python3.12-minimal (3.12.3-1ubuntu0.8) ...
#12 8.981 Setting up libpython3.12-minimal:amd64 (3.12.3-1ubuntu0.8) ...
#12 9.033 Setting up libexpat1:amd64 (2.6.1-2ubuntu0.3) ...
#12 9.068 Setting up python3.12-minimal (3.12.3-1ubuntu0.8) ...
#12 9.915 Selecting previously unselected package python3-minimal.
(Reading database ... 5749 files and directories currently installed.)
#12 9.930 Preparing to unpack .../0-python3-minimal_3.12.3-0ubuntu2_amd64.deb ...
#12 9.943 Unpacking python3-minimal (3.12.3-0ubuntu2) ...
#12 10.04 Selecting previously unselected package media-types.
#12 10.04 Preparing to unpack .../1-media-types_10.1.0_all.deb ...
#12 10.05 Unpacking media-types (10.1.0) ...
#12 10.15 Selecting previously unselected package netbase.
#12 10.16 Preparing to unpack .../2-netbase_6.4_all.deb ...
#12 10.17 Unpacking netbase (6.4) ...
#12 10.28 Selecting previously unselected package tzdata.
#12 10.28 Preparing to unpack .../3-tzdata_2025b-0ubuntu0.24.04.1_all.deb ...
#12 10.30 Unpacking tzdata (2025b-0ubuntu0.24.04.1) ...
#12 10.45 Selecting previously unselected package libpython3.12-stdlib:amd64.
#12 10.46 Preparing to unpack .../4-libpython3.12-stdlib_3.12.3-1ubuntu0.8_amd64.deb ...
#12 10.47 Unpacking libpython3.12-stdlib:amd64 (3.12.3-1ubuntu0.8) ...
#12 10.69 Selecting previously unselected package python3.12.
#12 10.69 Preparing to unpack .../5-python3.12_3.12.3-1ubuntu0.8_amd64.deb ...
#12 10.71 Unpacking python3.12 (3.12.3-1ubuntu0.8) ...
#12 10.80 Selecting previously unselected package libpython3-stdlib:amd64.
#12 10.80 Preparing to unpack .../6-libpython3-stdlib_3.12.3-0ubuntu2_amd64.deb ...
#12 10.81 Unpacking libpython3-stdlib:amd64 (3.12.3-0ubuntu2) ...
#12 10.91 Setting up python3-minimal (3.12.3-0ubuntu2) ...
#12 11.20 Selecting previously unselected package python3.
(Reading database ... 6719 files and directories currently installed.)
#12 11.22 Preparing to unpack .../0-python3_3.12.3-0ubuntu2_amd64.deb ...
#12 11.24 Unpacking python3 (3.12.3-0ubuntu2) ...
#12 11.34 Selecting previously unselected package python3-pkg-resources.
#12 11.34 Preparing to unpack .../1-python3-pkg-resources_68.1.2-2ubuntu1.2_all.deb ...
#12 11.36 Unpacking python3-pkg-resources (68.1.2-2ubuntu1.2) ...
#12 11.47 Selecting previously unselected package python3-setuptools.
#12 11.48 Preparing to unpack .../2-python3-setuptools_68.1.2-2ubuntu1.2_all.deb ...
#12 11.49 Unpacking python3-setuptools (68.1.2-2ubuntu1.2) ...
#12 11.63 Selecting previously unselected package python3-wheel.
#12 11.63 Preparing to unpack .../3-python3-wheel_0.42.0-2_all.deb ...
#12 11.64 Unpacking python3-wheel (0.42.0-2) ...
#12 11.75 Selecting previously unselected package python3-pip.
#12 11.75 Preparing to unpack .../4-python3-pip_24.0+dfsg-1ubuntu1.3_all.deb ...
#12 11.76 Unpacking python3-pip (24.0+dfsg-1ubuntu1.3) ...
#12 11.96 Selecting previously unselected package python3-pip-whl.
#12 11.97 Preparing to unpack .../5-python3-pip-whl_24.0+dfsg-1ubuntu1.3_all.deb ...
#12 11.98 Unpacking python3-pip-whl (24.0+dfsg-1ubuntu1.3) ...
#12 12.07 Selecting previously unselected package python3-setuptools-whl.
#12 12.08 Preparing to unpack .../6-python3-setuptools-whl_68.1.2-2ubuntu1.2_all.deb ...
#12 12.09 Unpacking python3-setuptools-whl (68.1.2-2ubuntu1.2) ...
#12 12.20 Selecting previously unselected package python3.12-venv.
#12 12.20 Preparing to unpack .../7-python3.12-venv_3.12.3-1ubuntu0.8_amd64.deb ...
#12 12.21 Unpacking python3.12-venv (3.12.3-1ubuntu0.8) ...
#12 12.29 Selecting previously unselected package python3-venv.
#12 12.30 Preparing to unpack .../8-python3-venv_3.12.3-0ubuntu2_amd64.deb ...
#12 12.31 Unpacking python3-venv (3.12.3-0ubuntu2) ...
#12 12.40 Setting up media-types (10.1.0) ...
#12 12.45 Setting up python3-setuptools-whl (68.1.2-2ubuntu1.2) ...
#12 12.48 Setting up python3-pip-whl (24.0+dfsg-1ubuntu1.3) ...
#12 12.52 Setting up tzdata (2025b-0ubuntu0.24.04.1) ...
#12 12.65
#12 12.65 Current default time zone: 'Etc/UTC'
#12 12.65 Local time is now: Thu Oct 30 19:11:50 UTC 2025.
#12 12.65 Universal Time is now: Thu Oct 30 19:11:50 UTC 2025.
#12 12.65 Run 'dpkg-reconfigure tzdata' if you wish to change it.
#12 12.65
#12 12.70 Setting up netbase (6.4) ...
#12 12.78 Setting up libpython3.12-stdlib:amd64 (3.12.3-1ubuntu0.8) ...
#12 12.82 Setting up python3.12 (3.12.3-1ubuntu0.8) ...
#12 13.69 Setting up libpython3-stdlib:amd64 (3.12.3-0ubuntu2) ...
#12 13.72 Setting up python3.12-venv (3.12.3-1ubuntu0.8) ...
#12 13.83 Setting up python3 (3.12.3-0ubuntu2) ...
#12 14.00 Setting up python3-wheel (0.42.0-2) ...
#12 14.21 Setting up python3-venv (3.12.3-0ubuntu2) ...
#12 14.25 Setting up python3-pkg-resources (68.1.2-2ubuntu1.2) ...
#12 14.53 Setting up python3-setuptools (68.1.2-2ubuntu1.2) ...
#12 15.06 Setting up python3-pip (24.0+dfsg-1ubuntu1.3) ...
#12 16.27 Processing triggers for libc-bin (2.39-0ubuntu8.5) ...
#12 DONE 16.8s
#13 [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
#13 DONE 0.4s
#14 [release 5/22] RUN groupadd -f -g 1000 holoscan
#14 DONE 0.2s
#15 [release 6/22] RUN useradd -rm -d /home/holoscan -s /bin/bash -g 1000 -G sudo -u 1000 holoscan
#15 0.233 useradd warning: holoscan's uid 1000 is greater than SYS_UID_MAX 999
#15 DONE 0.3s
#16 [release 7/22] RUN chown -R holoscan /var/holoscan && chown -R holoscan /var/holoscan/input && chown -R holoscan /var/holoscan/output
#16 DONE 0.2s
#17 [release 8/22] WORKDIR /var/holoscan
#17 DONE 0.1s
#18 [release 9/22] COPY ./tools /var/holoscan/tools
#18 DONE 0.1s
#19 [release 10/22] RUN chmod +x /var/holoscan/tools
#19 DONE 0.2s
#20 [release 11/22] RUN rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED
#20 DONE 0.2s
#21 [release 12/22] WORKDIR /var/holoscan
#21 DONE 0.1s
#22 [release 13/22] COPY ./pip/requirements.txt /tmp/requirements.txt
#22 DONE 0.1s
#23 [release 14/22] RUN pip install --upgrade pip
#23 0.451 Defaulting to user installation because normal site-packages is not writeable
#23 0.487 Requirement already satisfied: pip in /usr/lib/python3/dist-packages (24.0)
#23 0.666 Collecting pip
#23 0.749 Downloading pip-25.3-py3-none-any.whl.metadata (4.7 kB)
#23 0.789 Downloading pip-25.3-py3-none-any.whl (1.8 MB)
#23 0.921 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 17.8 MB/s eta 0:00:00
#23 0.943 Installing collected packages: pip
#23 1.727 Successfully installed pip-25.3
#23 DONE 1.9s
#24 [release 15/22] RUN pip install --no-cache-dir --user -r /tmp/requirements.txt
#24 0.612 Collecting highdicom>=0.18.2 (from -r /tmp/requirements.txt (line 1))
#24 0.675 Downloading highdicom-0.27.0-py3-none-any.whl.metadata (5.8 kB)
#24 0.766 Collecting monai>=1.0 (from -r /tmp/requirements.txt (line 2))
#24 0.773 Downloading monai-1.5.1-py3-none-any.whl.metadata (13 kB)
#24 0.820 Collecting nibabel>=3.2.1 (from -r /tmp/requirements.txt (line 3))
#24 0.825 Downloading nibabel-5.3.2-py3-none-any.whl.metadata (9.1 kB)
#24 1.050 Collecting numpy>=1.21.6 (from -r /tmp/requirements.txt (line 4))
#24 1.053 Downloading numpy-2.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (62 kB)
#24 1.103 Collecting pydicom>=2.3.0 (from -r /tmp/requirements.txt (line 5))
#24 1.113 Downloading pydicom-3.0.1-py3-none-any.whl.metadata (9.4 kB)
#24 1.130 Requirement already satisfied: setuptools>=59.5.0 in /usr/lib/python3/dist-packages (from -r /tmp/requirements.txt (line 6)) (68.1.2)
#24 1.161 Collecting SimpleITK>=2.0.0 (from -r /tmp/requirements.txt (line 7))
#24 1.166 Downloading simpleitk-2.5.2-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (7.2 kB)
#24 1.210 Collecting torch>=1.12.0 (from -r /tmp/requirements.txt (line 8))
#24 1.214 Downloading torch-2.9.0-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (30 kB)
#24 1.368 Collecting pillow>=8.3 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 1))
#24 1.372 Downloading pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (8.8 kB)
#24 1.476 Collecting pyjpegls>=1.0.0 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 1))
#24 1.555 Downloading pyjpegls-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.5 kB)
#24 1.585 Collecting typing-extensions>=4.0.0 (from highdicom>=0.18.2->-r /tmp/requirements.txt (line 1))
#24 1.588 Downloading typing_extensions-4.15.0-py3-none-any.whl.metadata (3.3 kB)
#24 1.623 Collecting packaging>=20 (from nibabel>=3.2.1->-r /tmp/requirements.txt (line 3))
#24 1.628 Downloading packaging-25.0-py3-none-any.whl.metadata (3.3 kB)
#24 1.663 Collecting filelock (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.667 Downloading filelock-3.20.0-py3-none-any.whl.metadata (2.1 kB)
#24 1.683 Collecting sympy>=1.13.3 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.687 Downloading sympy-1.14.0-py3-none-any.whl.metadata (12 kB)
#24 1.709 Collecting networkx>=2.5.1 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.712 Downloading networkx-3.5-py3-none-any.whl.metadata (6.3 kB)
#24 1.727 Collecting jinja2 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.730 Downloading jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB)
#24 1.751 Collecting fsspec>=0.8.5 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.754 Downloading fsspec-2025.10.0-py3-none-any.whl.metadata (10 kB)
#24 1.785 Collecting nvidia-cuda-nvrtc-cu12==12.8.93 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.788 Downloading nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl.metadata (1.7 kB)
#24 1.800 Collecting nvidia-cuda-runtime-cu12==12.8.90 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.803 Downloading nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (1.7 kB)
#24 1.812 Collecting nvidia-cuda-cupti-cu12==12.8.90 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.816 Downloading nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (1.7 kB)
#24 1.827 Collecting nvidia-cudnn-cu12==9.10.2.21 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.830 Downloading nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl.metadata (1.8 kB)
#24 1.839 Collecting nvidia-cublas-cu12==12.8.4.1 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.842 Downloading nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl.metadata (1.7 kB)
#24 1.860 Collecting nvidia-cufft-cu12==11.3.3.83 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.867 Downloading nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (1.7 kB)
#24 1.882 Collecting nvidia-curand-cu12==10.3.9.90 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.885 Downloading nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl.metadata (1.7 kB)
#24 1.895 Collecting nvidia-cusolver-cu12==11.7.3.90 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.899 Downloading nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl.metadata (1.8 kB)
#24 1.907 Collecting nvidia-cusparse-cu12==12.5.8.93 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.910 Downloading nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (1.8 kB)
#24 1.918 Collecting nvidia-cusparselt-cu12==0.7.1 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.921 Downloading nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl.metadata (7.0 kB)
#24 1.931 Collecting nvidia-nccl-cu12==2.27.5 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.934 Downloading nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (2.0 kB)
#24 1.942 Collecting nvidia-nvshmem-cu12==3.3.20 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.945 Downloading nvidia_nvshmem_cu12-3.3.20-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (2.1 kB)
#24 1.964 Collecting nvidia-nvtx-cu12==12.8.90 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.976 Downloading nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (1.8 kB)
#24 1.993 Collecting nvidia-nvjitlink-cu12==12.8.93 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 1.997 Downloading nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl.metadata (1.7 kB)
#24 2.006 Collecting nvidia-cufile-cu12==1.13.1.3 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 2.010 Downloading nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (1.7 kB)
#24 2.027 Collecting triton==3.5.0 (from torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 2.033 Downloading triton-3.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (1.7 kB)
#24 2.079 Collecting mpmath<1.4,>=1.1.0 (from sympy>=1.13.3->torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 2.082 Downloading mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB)
#24 2.128 Collecting MarkupSafe>=2.0 (from jinja2->torch>=1.12.0->-r /tmp/requirements.txt (line 8))
#24 2.132 Downloading markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (2.7 kB)
#24 2.141 Downloading highdicom-0.27.0-py3-none-any.whl (1.1 MB)
#24 2.162 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 68.1 MB/s 0:00:00
#24 2.167 Downloading monai-1.5.1-py3-none-any.whl (2.7 MB)
#24 2.200 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.7/2.7 MB 93.1 MB/s 0:00:00
#24 2.205 Downloading numpy-2.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (16.6 MB)
#24 2.351 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.6/16.6 MB 117.7 MB/s 0:00:00
#24 2.358 Downloading nibabel-5.3.2-py3-none-any.whl (3.3 MB)
#24 2.390 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3/3.3 MB 118.2 MB/s 0:00:00
#24 2.396 Downloading pydicom-3.0.1-py3-none-any.whl (2.4 MB)
#24 2.420 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.4/2.4 MB 118.3 MB/s 0:00:00
#24 2.428 Downloading simpleitk-2.5.2-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (52.6 MB)
#24 3.192 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 52.6/52.6 MB 69.8 MB/s 0:00:00
#24 3.199 Downloading torch-2.9.0-cp312-cp312-manylinux_2_28_x86_64.whl (899.7 MB)
#24 15.06 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 899.7/899.7 MB 87.9 MB/s 0:00:11
#24 15.06 Downloading nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl (594.3 MB)
#24 20.38 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 594.3/594.3 MB 112.5 MB/s 0:00:05
#24 20.38 Downloading nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (10.2 MB)
#24 20.51 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.2/10.2 MB 84.3 MB/s 0:00:00
#24 20.51 Downloading nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl (88.0 MB)
#24 21.30 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 88.0/88.0 MB 112.7 MB/s 0:00:00
#24 21.31 Downloading nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (954 kB)
#24 21.32 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 954.8/954.8 kB 123.3 MB/s 0:00:00
#24 21.33 Downloading nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl (706.8 MB)
#24 29.89 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 706.8/706.8 MB 83.3 MB/s 0:00:08
#24 29.90 Downloading nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (193.1 MB)
#24 31.97 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 193.1/193.1 MB 93.4 MB/s 0:00:02
#24 31.97 Downloading nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (1.2 MB)
#24 31.99 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 122.2 MB/s 0:00:00
#24 32.00 Downloading nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl (63.6 MB)
#24 32.63 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 63.6/63.6 MB 100.8 MB/s 0:00:00
#24 32.64 Downloading nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl (267.5 MB)
#24 35.30 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 267.5/267.5 MB 100.5 MB/s 0:00:02
#24 35.30 Downloading nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (288.2 MB)
#24 37.78 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 288.2/288.2 MB 116.2 MB/s 0:00:02
#24 37.79 Downloading nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl (287.2 MB)
#24 40.73 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 287.2/287.2 MB 96.5 MB/s 0:00:02
#24 40.73 Downloading nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (322.3 MB)
#24 44.37 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 322.3/322.3 MB 88.1 MB/s 0:00:03
#24 44.37 Downloading nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl (39.3 MB)
#24 44.72 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 39.3/39.3 MB 113.1 MB/s 0:00:00
#24 44.73 Downloading nvidia_nvshmem_cu12-3.3.20-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (124.7 MB)
#24 45.80 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 124.7/124.7 MB 116.5 MB/s 0:00:01
#24 45.81 Downloading nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (89 kB)
#24 45.82 Downloading triton-3.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (170.5 MB)
#24 48.20 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 170.5/170.5 MB 71.5 MB/s 0:00:02
#24 48.21 Downloading fsspec-2025.10.0-py3-none-any.whl (200 kB)
#24 48.21 Downloading networkx-3.5-py3-none-any.whl (2.0 MB)
#24 48.23 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.0/2.0 MB 113.0 MB/s 0:00:00
#24 48.24 Downloading packaging-25.0-py3-none-any.whl (66 kB)
#24 48.25 Downloading pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (7.0 MB)
#24 48.31 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.0/7.0 MB 118.4 MB/s 0:00:00
#24 48.39 Downloading pyjpegls-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.7 MB)
#24 48.57 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.7/2.7 MB 14.3 MB/s 0:00:00
#24 48.58 Downloading sympy-1.14.0-py3-none-any.whl (6.3 MB)
#24 48.63 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.3/6.3 MB 116.8 MB/s 0:00:00
#24 48.64 Downloading mpmath-1.3.0-py3-none-any.whl (536 kB)
#24 48.64 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 536.2/536.2 kB 104.3 MB/s 0:00:00
#24 48.65 Downloading typing_extensions-4.15.0-py3-none-any.whl (44 kB)
#24 48.65 Downloading filelock-3.20.0-py3-none-any.whl (16 kB)
#24 48.66 Downloading jinja2-3.1.6-py3-none-any.whl (134 kB)
#24 48.66 Downloading markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (22 kB)
#24 59.64 Installing collected packages: SimpleITK, nvidia-cusparselt-cu12, mpmath, typing-extensions, triton, sympy, pydicom, pillow, packaging, nvidia-nvtx-cu12, nvidia-nvshmem-cu12, nvidia-nvjitlink-cu12, nvidia-nccl-cu12, nvidia-curand-cu12, nvidia-cufile-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, numpy, networkx, MarkupSafe, fsspec, filelock, pyjpegls, nvidia-cusparse-cu12, nvidia-cufft-cu12, nvidia-cudnn-cu12, nibabel, jinja2, nvidia-cusolver-cu12, highdicom, torch, monai
#24 138.2
#24 138.3 Successfully installed MarkupSafe-3.0.3 SimpleITK-2.5.2 filelock-3.20.0 fsspec-2025.10.0 highdicom-0.27.0 jinja2-3.1.6 monai-1.5.1 mpmath-1.3.0 networkx-3.5 nibabel-5.3.2 numpy-2.3.4 nvidia-cublas-cu12-12.8.4.1 nvidia-cuda-cupti-cu12-12.8.90 nvidia-cuda-nvrtc-cu12-12.8.93 nvidia-cuda-runtime-cu12-12.8.90 nvidia-cudnn-cu12-9.10.2.21 nvidia-cufft-cu12-11.3.3.83 nvidia-cufile-cu12-1.13.1.3 nvidia-curand-cu12-10.3.9.90 nvidia-cusolver-cu12-11.7.3.90 nvidia-cusparse-cu12-12.5.8.93 nvidia-cusparselt-cu12-0.7.1 nvidia-nccl-cu12-2.27.5 nvidia-nvjitlink-cu12-12.8.93 nvidia-nvshmem-cu12-3.3.20 nvidia-nvtx-cu12-12.8.90 packaging-25.0 pillow-12.0.0 pydicom-3.0.1 pyjpegls-1.5.1 sympy-1.14.0 torch-2.9.0 triton-3.5.0 typing-extensions-4.15.0
#24 DONE 140.5s
#25 [release 16/22] COPY ./monai_deploy_app_sdk-1.0.0+48.gfd5999e.dirty-py3-none-any.whl /tmp/monai_deploy_app_sdk-1.0.0+48.gfd5999e.dirty-py3-none-any.whl
#25 DONE 0.3s
#26 [release 17/22] RUN pip install /tmp/monai_deploy_app_sdk-1.0.0+48.gfd5999e.dirty-py3-none-any.whl
#26 0.567 Defaulting to user installation because normal site-packages is not writeable
#26 0.637 Processing /tmp/monai_deploy_app_sdk-1.0.0+48.gfd5999e.dirty-py3-none-any.whl
#26 0.646 Requirement already satisfied: numpy>=1.21.6 in /home/holoscan/.local/lib/python3.12/site-packages (from monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty) (2.3.4)
#26 0.795 Collecting holoscan-cu12 (from monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 0.886 Downloading holoscan_cu12-3.7.0-cp312-cp312-manylinux_2_35_x86_64.whl.metadata (7.1 kB)
#26 1.007 Collecting holoscan-cli (from monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 1.019 Downloading holoscan_cli-3.7.0-py3-none-any.whl.metadata (4.0 kB)
#26 1.074 Collecting colorama>=0.4.1 (from monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 1.080 Downloading colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB)
#26 1.156 Collecting tritonclient>=2.53.0 (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 1.162 Downloading tritonclient-2.61.0-py3-none-manylinux1_x86_64.whl.metadata (2.9 kB)
#26 1.222 Collecting typeguard>=3.0.0 (from monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 1.225 Downloading typeguard-4.4.4-py3-none-any.whl.metadata (3.3 kB)
#26 1.272 Collecting perf-analyzer (from tritonclient>=2.53.0->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 1.280 Downloading perf_analyzer-2.59.1-py3-none-manylinux_2_38_x86_64.whl.metadata (6.3 kB)
#26 1.425 Collecting python-rapidjson>=0.9.1 (from tritonclient>=2.53.0->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 1.430 Downloading python_rapidjson-1.22-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (24 kB)
#26 1.522 Collecting urllib3>=2.0.7 (from tritonclient>=2.53.0->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 1.526 Downloading urllib3-2.5.0-py3-none-any.whl.metadata (6.5 kB)
#26 2.024 Collecting aiohttp<4.0.0,>=3.8.1 (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 2.028 Downloading aiohttp-3.13.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (8.1 kB)
#26 2.112 Collecting cuda-python (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 2.116 Downloading cuda_python-13.0.3-py3-none-any.whl.metadata (4.7 kB)
#26 2.291 Collecting geventhttpclient>=2.3.3 (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 2.296 Downloading geventhttpclient-2.3.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (8.4 kB)
#26 2.764 Collecting grpcio<1.68,>=1.63.0 (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 2.768 Downloading grpcio-1.67.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.9 kB)
#26 2.785 Requirement already satisfied: packaging>=14.1 in /home/holoscan/.local/lib/python3.12/site-packages (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty) (25.0)
#26 3.026 Collecting protobuf<6.0dev,>=5.26.1 (from tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 3.029 Downloading protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl.metadata (592 bytes)
#26 3.085 Collecting aiohappyeyeballs>=2.5.0 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 3.090 Downloading aiohappyeyeballs-2.6.1-py3-none-any.whl.metadata (5.9 kB)
#26 3.138 Collecting aiosignal>=1.4.0 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 3.145 Downloading aiosignal-1.4.0-py3-none-any.whl.metadata (3.7 kB)
#26 3.205 Collecting attrs>=17.3.0 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 3.209 Downloading attrs-25.4.0-py3-none-any.whl.metadata (10 kB)
#26 3.322 Collecting frozenlist>=1.1.1 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 3.329 Downloading frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (20 kB)
#26 3.584 Collecting multidict<7.0,>=4.5 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 3.588 Downloading multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (5.3 kB)
#26 3.684 Collecting propcache>=0.2.0 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 3.688 Downloading propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (13 kB)
#26 3.943 Collecting yarl<2.0,>=1.17.0 (from aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 3.947 Downloading yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (75 kB)
#26 4.024 Collecting idna>=2.0 (from yarl<2.0,>=1.17.0->aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 4.028 Downloading idna-3.11-py3-none-any.whl.metadata (8.4 kB)
#26 4.065 Requirement already satisfied: typing-extensions>=4.2 in /home/holoscan/.local/lib/python3.12/site-packages (from aiosignal>=1.4.0->aiohttp<4.0.0,>=3.8.1->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty) (4.15.0)
#26 4.241 Collecting gevent (from geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 4.249 Downloading gevent-25.9.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (14 kB)
#26 4.313 Collecting certifi (from geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 4.317 Downloading certifi-2025.10.5-py3-none-any.whl.metadata (2.5 kB)
#26 4.387 Collecting brotli (from geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 4.393 Downloading Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.5 kB)
#26 4.467 Collecting cuda-bindings~=13.0.3 (from cuda-python->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 4.471 Downloading cuda_bindings-13.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (2.3 kB)
#26 4.513 Collecting cuda-pathfinder~=1.1 (from cuda-python->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 4.519 Downloading cuda_pathfinder-1.3.2-py3-none-any.whl.metadata (1.9 kB)
#26 4.682 Collecting greenlet>=3.2.2 (from gevent->geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 4.685 Downloading greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (4.1 kB)
#26 4.737 Collecting zope.event (from gevent->geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 4.741 Downloading zope_event-6.0-py3-none-any.whl.metadata (5.1 kB)
#26 4.889 Collecting zope.interface (from gevent->geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 4.895 Downloading zope_interface-8.0.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl.metadata (44 kB)
#26 4.928 Requirement already satisfied: Jinja2<4.0.0,>=3.1.6 in /home/holoscan/.local/lib/python3.12/site-packages (from holoscan-cli->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty) (3.1.6)
#26 4.929 Requirement already satisfied: pip>25.1.0 in /home/holoscan/.local/lib/python3.12/site-packages (from holoscan-cli->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty) (25.3)
#26 5.014 Collecting psutil<8.0,>=7.0.0 (from holoscan-cli->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 5.018 Downloading psutil-7.1.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl.metadata (23 kB)
#26 5.101 Collecting python-on-whales>=0.77.0 (from holoscan-cli->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 5.106 Downloading python_on_whales-0.79.0-py3-none-any.whl.metadata (18 kB)
#26 5.181 Collecting pyyaml<7.0,>=6.0 (from holoscan-cli->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 5.184 Downloading pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (2.4 kB)
#26 5.250 Collecting requests<3.0,>=2.32 (from holoscan-cli->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 5.255 Downloading requests-2.32.5-py3-none-any.whl.metadata (4.9 kB)
#26 5.274 Requirement already satisfied: MarkupSafe>=2.0 in /home/holoscan/.local/lib/python3.12/site-packages (from Jinja2<4.0.0,>=3.1.6->holoscan-cli->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty) (3.0.3)
#26 5.376 Collecting charset_normalizer<4,>=2 (from requests<3.0,>=2.32->holoscan-cli->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 5.385 Downloading charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (37 kB)
#26 5.633 Collecting pydantic!=2.0.*,<3,>=2 (from python-on-whales>=0.77.0->holoscan-cli->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 5.637 Downloading pydantic-2.12.3-py3-none-any.whl.metadata (87 kB)
#26 5.682 Collecting annotated-types>=0.6.0 (from pydantic!=2.0.*,<3,>=2->python-on-whales>=0.77.0->holoscan-cli->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 5.687 Downloading annotated_types-0.7.0-py3-none-any.whl.metadata (15 kB)
#26 6.424 Collecting pydantic-core==2.41.4 (from pydantic!=2.0.*,<3,>=2->python-on-whales>=0.77.0->holoscan-cli->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 6.428 Downloading pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (7.3 kB)
#26 6.469 Collecting typing-inspection>=0.4.2 (from pydantic!=2.0.*,<3,>=2->python-on-whales>=0.77.0->holoscan-cli->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 6.476 Downloading typing_inspection-0.4.2-py3-none-any.whl.metadata (2.6 kB)
#26 6.543 Collecting cloudpickle<4.0,>=3.0 (from holoscan-cu12->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 6.548 Downloading cloudpickle-3.1.1-py3-none-any.whl.metadata (7.1 kB)
#26 6.566 Requirement already satisfied: pillow>=11.2 in /home/holoscan/.local/lib/python3.12/site-packages (from holoscan-cu12->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty) (12.0.0)
#26 6.610 Collecting cupy-cuda12x<14.0,>=12.2 (from holoscan-cu12->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 6.615 Downloading cupy_cuda12x-13.6.0-cp312-cp312-manylinux2014_x86_64.whl.metadata (2.4 kB)
#26 6.660 Collecting wheel-axle-runtime<1.0 (from holoscan-cu12->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 6.667 Downloading wheel_axle_runtime-0.0.7-py3-none-any.whl.metadata (8.3 kB)
#26 6.750 Collecting fastrlock>=0.5 (from cupy-cuda12x<14.0,>=12.2->holoscan-cu12->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 6.755 Downloading fastrlock-0.8.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl.metadata (7.7 kB)
#26 6.776 Requirement already satisfied: filelock in /home/holoscan/.local/lib/python3.12/site-packages (from wheel-axle-runtime<1.0->holoscan-cu12->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty) (3.20.0)
#26 6.894 Collecting setuptools>=75.8.2 (from zope.event->gevent->geventhttpclient>=2.3.3->tritonclient[all]>=2.53.0->monai-deploy-app-sdk==1.0.0+48.gfd5999e.dirty)
#26 6.898 Downloading setuptools-80.9.0-py3-none-any.whl.metadata (6.6 kB)
#26 6.929 Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)
#26 6.953 Downloading tritonclient-2.61.0-py3-none-manylinux1_x86_64.whl (111 kB)
#26 6.977 Downloading python_rapidjson-1.22-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.7 MB)
#26 7.022 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 38.0 MB/s 0:00:00
#26 7.029 Downloading aiohttp-3.13.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.8 MB)
#26 7.077 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 36.1 MB/s 0:00:00
#26 7.084 Downloading grpcio-1.67.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.9 MB)
#26 7.271 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.9/5.9 MB 31.3 MB/s 0:00:00
#26 7.280 Downloading multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (256 kB)
#26 7.310 Downloading protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl (319 kB)
#26 7.378 Downloading yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (377 kB)
#26 7.406 Downloading aiohappyeyeballs-2.6.1-py3-none-any.whl (15 kB)
#26 7.427 Downloading aiosignal-1.4.0-py3-none-any.whl (7.5 kB)
#26 7.451 Downloading attrs-25.4.0-py3-none-any.whl (67 kB)
#26 7.475 Downloading frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (242 kB)
#26 7.501 Downloading geventhttpclient-2.3.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (114 kB)
#26 7.524 Downloading idna-3.11-py3-none-any.whl (71 kB)
#26 7.548 Downloading propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (221 kB)
#26 7.574 Downloading typeguard-4.4.4-py3-none-any.whl (34 kB)
#26 7.605 Downloading urllib3-2.5.0-py3-none-any.whl (129 kB)
#26 7.627 Downloading Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.9 MB)
#26 7.691 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.9/2.9 MB 47.1 MB/s 0:00:00
#26 7.698 Downloading certifi-2025.10.5-py3-none-any.whl (163 kB)
#26 7.723 Downloading cuda_python-13.0.3-py3-none-any.whl (7.6 kB)
#26 7.750 Downloading cuda_bindings-13.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (12.1 MB)
#26 7.970 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.1/12.1 MB 55.6 MB/s 0:00:00
#26 7.976 Downloading cuda_pathfinder-1.3.2-py3-none-any.whl (27 kB)
#26 7.998 Downloading gevent-25.9.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (2.1 MB)
#26 8.045 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 45.2 MB/s 0:00:00
#26 8.051 Downloading greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (607 kB)
#26 8.079 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 607.6/607.6 kB 15.3 MB/s 0:00:00
#26 8.087 Downloading holoscan_cli-3.7.0-py3-none-any.whl (77 kB)
#26 8.109 Downloading psutil-7.1.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl (258 kB)
#26 8.135 Downloading pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (807 kB)
#26 8.166 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 807.9/807.9 kB 21.5 MB/s 0:00:00
#26 8.173 Downloading requests-2.32.5-py3-none-any.whl (64 kB)
#26 8.197 Downloading charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (153 kB)
#26 8.225 Downloading python_on_whales-0.79.0-py3-none-any.whl (118 kB)
#26 8.251 Downloading pydantic-2.12.3-py3-none-any.whl (462 kB)
#26 8.283 Downloading pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB)
#26 8.330 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 44.8 MB/s 0:00:00
#26 8.337 Downloading annotated_types-0.7.0-py3-none-any.whl (13 kB)
#26 8.359 Downloading typing_inspection-0.4.2-py3-none-any.whl (14 kB)
#26 8.381 Downloading holoscan_cu12-3.7.0-cp312-cp312-manylinux_2_35_x86_64.whl (40.7 MB)
#26 9.287 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.7/40.7 MB 45.0 MB/s 0:00:00
#26 9.291 Downloading cloudpickle-3.1.1-py3-none-any.whl (20 kB)
#26 9.315 Downloading cupy_cuda12x-13.6.0-cp312-cp312-manylinux2014_x86_64.whl (112.9 MB)
#26 11.44 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 112.9/112.9 MB 53.1 MB/s 0:00:02
#26 11.45 Downloading wheel_axle_runtime-0.0.7-py3-none-any.whl (14 kB)
#26 11.47 Downloading fastrlock-0.8.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl (53 kB)
#26 11.49 Downloading perf_analyzer-2.59.1-py3-none-manylinux_2_38_x86_64.whl (7.2 MB)
#26 11.80 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.2/7.2 MB 23.1 MB/s 0:00:00
#26 11.80 Downloading zope_event-6.0-py3-none-any.whl (6.4 kB)
#26 11.82 Downloading setuptools-80.9.0-py3-none-any.whl (1.2 MB)
#26 11.86 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 32.5 MB/s 0:00:00
#26 11.87 Downloading zope_interface-8.0.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl (264 kB)
#26 12.51 Installing collected packages: perf-analyzer, fastrlock, brotli, zope.interface, wheel-axle-runtime, urllib3, typing-inspection, typeguard, setuptools, pyyaml, python-rapidjson, pydantic-core, psutil, protobuf, propcache, multidict, idna, grpcio, greenlet, frozenlist, cupy-cuda12x, cuda-pathfinder, colorama, cloudpickle, charset_normalizer, certifi, attrs, annotated-types, aiohappyeyeballs, zope.event, yarl, tritonclient, requests, pydantic, holoscan-cu12, cuda-bindings, aiosignal, python-on-whales, gevent, cuda-python, aiohttp, holoscan-cli, geventhttpclient, monai-deploy-app-sdk
#26 19.38
#26 19.40 Successfully installed aiohappyeyeballs-2.6.1 aiohttp-3.13.2 aiosignal-1.4.0 annotated-types-0.7.0 attrs-25.4.0 brotli-1.1.0 certifi-2025.10.5 charset_normalizer-3.4.4 cloudpickle-3.1.1 colorama-0.4.6 cuda-bindings-13.0.3 cuda-pathfinder-1.3.2 cuda-python-13.0.3 cupy-cuda12x-13.6.0 fastrlock-0.8.3 frozenlist-1.8.0 gevent-25.9.1 geventhttpclient-2.3.5 greenlet-3.2.4 grpcio-1.67.1 holoscan-cli-3.7.0 holoscan-cu12-3.7.0 idna-3.11 monai-deploy-app-sdk-1.0.0+48.gfd5999e.dirty multidict-6.7.0 perf-analyzer-2.59.1 propcache-0.4.1 protobuf-5.29.5 psutil-7.1.2 pydantic-2.12.3 pydantic-core-2.41.4 python-on-whales-0.79.0 python-rapidjson-1.22 pyyaml-6.0.3 requests-2.32.5 setuptools-80.9.0 tritonclient-2.61.0 typeguard-4.4.4 typing-inspection-0.4.2 urllib3-2.5.0 wheel-axle-runtime-0.0.7 yarl-1.22.0 zope.event-6.0 zope.interface-8.0.1
#26 DONE 24.0s
#27 [release 18/22] COPY ./models /opt/holoscan/models
#27 DONE 0.3s
#28 [release 19/22] COPY ./map/app.json /etc/holoscan/app.json
#28 DONE 0.1s
#29 [release 20/22] COPY ./app.config /var/holoscan/app.yaml
#29 DONE 0.1s
#30 [release 21/22] COPY ./map/pkg.json /etc/holoscan/pkg.json
#30 DONE 0.0s
#31 [release 22/22] COPY ./app /opt/holoscan/app
#31 DONE 0.1s
#32 exporting to docker image format
#32 exporting layers
#32 exporting layers 221.5s done
#32 exporting manifest sha256:0a8e962a77fecbccb2355fea6e36ce945cc5ef31532adf41f2983330e352a38c 0.0s done
#32 exporting config sha256:091c1b0dabf9b14f31cd49c2099ae82793a38b59decac84678aebfb60bd1f2c0 0.0s done
#32 sending tarball
#32 ...
#33 importing to docker
#33 loading layer 107cbdaeec04 327.68kB / 29.72MB
#33 loading layer 5b4d734793bb 65.54kB / 4.55MB
#33 loading layer d476e855ba3c 557.06kB / 105.07MB
#33 loading layer d476e855ba3c 47.35MB / 105.07MB 2.1s
#33 loading layer 67f0dd5c7f3f 186B / 186B
#33 loading layer 5a78bf589884 6.88kB / 6.88kB
#33 loading layer 4fc6b425ed47 557.06kB / 1.51GB
#33 loading layer 4fc6b425ed47 165.45MB / 1.51GB 2.1s
#33 loading layer 4fc6b425ed47 251.79MB / 1.51GB 4.1s
#33 loading layer 4fc6b425ed47 377.13MB / 1.51GB 6.1s
#33 loading layer 4fc6b425ed47 502.46MB / 1.51GB 8.1s
#33 loading layer 4fc6b425ed47 631.14MB / 1.51GB 10.2s
#33 loading layer 4fc6b425ed47 743.11MB / 1.51GB 12.2s
#33 loading layer 4fc6b425ed47 863.44MB / 1.51GB 14.3s
#33 loading layer 4fc6b425ed47 999.36MB / 1.51GB 16.3s
#33 loading layer 4fc6b425ed47 1.12GB / 1.51GB 18.3s
#33 loading layer 4fc6b425ed47 1.27GB / 1.51GB 20.4s
#33 loading layer 4fc6b425ed47 1.39GB / 1.51GB 22.5s
#33 loading layer 905bb691d828 32.77kB / 59.61kB
#33 loading layer 5e896433c89f 1.68kB / 1.68kB
#33 loading layer d9d614cc706c 1.52kB / 1.52kB
#33 loading layer 2e82ae164bf2 32.77kB / 2.58MB
#33 loading layer d2a2631ea504 200B / 200B
#33 loading layer c3812e2eef35 425.98kB / 40.21MB
#33 loading layer 7ae752670ba9 229.38kB / 20.86MB
#33 loading layer b1dd5d5e6dd7 1.30kB / 1.30kB
#33 loading layer 12bc547cb353 612B / 612B
#33 loading layer 0ced5c112476 3.37kB / 3.37kB
#33 loading layer 35d0c6af7304 156B / 156B
#33 loading layer 5f70bf18a086 32B / 32B
#33 loading layer 1a70ec7b5f95 3.60kB / 3.60kB
#33 loading layer 7883affb98a9 3.60kB / 3.60kB
#33 loading layer 232470ddca8c 197B / 197B
#33 loading layer 15de3fa4006e 252B / 252B
#33 loading layer 89c05ac10d6a 65.54kB / 5.38MB
#33 loading layer 263e6f285311 557.06kB / 4.23GB
#33 loading layer 263e6f285311 84.67MB / 4.23GB 6.2s
#33 loading layer 263e6f285311 350.39MB / 4.23GB 12.3s
#33 loading layer 263e6f285311 592.71MB / 4.23GB 16.3s
#33 loading layer 263e6f285311 867.34MB / 4.23GB 22.5s
#33 loading layer 263e6f285311 1.08GB / 4.23GB 26.7s
#33 loading layer 263e6f285311 1.32GB / 4.23GB 30.9s
#33 loading layer 263e6f285311 1.54GB / 4.23GB 34.9s
#33 loading layer 263e6f285311 1.85GB / 4.23GB 41.1s
#33 loading layer 263e6f285311 2.06GB / 4.23GB 45.2s
#33 loading layer 263e6f285311 2.31GB / 4.23GB 49.3s
#33 loading layer 263e6f285311 2.63GB / 4.23GB 55.5s
#33 loading layer 263e6f285311 2.88GB / 4.23GB 59.7s
#33 loading layer 263e6f285311 3.13GB / 4.23GB 65.8s
#33 loading layer 263e6f285311 3.16GB / 4.23GB 71.5s
#33 loading layer 263e6f285311 3.27GB / 4.23GB 77.7s
#33 loading layer 263e6f285311 3.58GB / 4.23GB 83.9s
#33 loading layer 263e6f285311 3.79GB / 4.23GB 87.9s
#33 loading layer 263e6f285311 4.06GB / 4.23GB 94.2s
#33 loading layer 263e6f285311 4.20GB / 4.23GB 100.3s
#33 loading layer 0cf1cce37748 32.77kB / 141.77kB
#33 loading layer afd31ee4b88a 557.06kB / 405.66MB
#33 loading layer afd31ee4b88a 35.65MB / 405.66MB 2.0s
#33 loading layer afd31ee4b88a 76.87MB / 405.66MB 4.1s
#33 loading layer afd31ee4b88a 113.64MB / 405.66MB 6.2s
#33 loading layer afd31ee4b88a 174.36MB / 405.66MB 8.2s
#33 loading layer afd31ee4b88a 217.81MB / 405.66MB 10.2s
#33 loading layer afd31ee4b88a 258.47MB / 405.66MB 12.3s
#33 loading layer afd31ee4b88a 335.35MB / 405.66MB 14.3s
#33 loading layer afd31ee4b88a 384.37MB / 405.66MB 16.4s
#33 loading layer 72b5457169d1 196.61kB / 17.81MB
#33 loading layer 365947273ac7 483B / 483B
#33 loading layer 8b08f0cd86e6 311B / 311B
#33 loading layer 724079108c2a 298B / 298B
#33 loading layer 7745de7f2569 3.90kB / 3.90kB
#33 loading layer 2e82ae164bf2 2.58MB / 2.58MB 127.8s done
#33 loading layer 107cbdaeec04 29.72MB / 29.72MB 164.2s done
#33 loading layer 5b4d734793bb 4.55MB / 4.55MB 162.2s done
#33 loading layer d476e855ba3c 105.07MB / 105.07MB 161.6s done
#33 loading layer 67f0dd5c7f3f 186B / 186B 157.4s done
#33 loading layer 5a78bf589884 6.88kB / 6.88kB 156.7s done
#33 loading layer 4fc6b425ed47 1.51GB / 1.51GB 155.8s done
#33 loading layer 905bb691d828 59.61kB / 59.61kB 129.5s done
#33 loading layer 5e896433c89f 1.68kB / 1.68kB 128.9s done
#33 loading layer d9d614cc706c 1.52kB / 1.52kB 128.4s done
#33 loading layer d2a2631ea504 200B / 200B 127.3s done
#33 loading layer c3812e2eef35 40.21MB / 40.21MB 126.5s done
#33 loading layer 7ae752670ba9 20.86MB / 20.86MB 125.2s done
#33 loading layer b1dd5d5e6dd7 1.30kB / 1.30kB 123.1s done
#33 loading layer 12bc547cb353 612B / 612B 123.1s done
#33 loading layer 0ced5c112476 3.37kB / 3.37kB 123.0s done
#33 loading layer 35d0c6af7304 156B / 156B 122.9s done
#33 loading layer 5f70bf18a086 32B / 32B 122.9s done
#33 loading layer 1a70ec7b5f95 3.60kB / 3.60kB 122.8s done
#33 loading layer 7883affb98a9 3.60kB / 3.60kB 122.8s done
#33 loading layer 232470ddca8c 197B / 197B 122.7s done
#33 loading layer 15de3fa4006e 252B / 252B 122.6s done
#33 loading layer 89c05ac10d6a 5.38MB / 5.38MB 122.5s done
#33 loading layer 263e6f285311 4.23GB / 4.23GB 121.9s done
#33 loading layer 0cf1cce37748 141.77kB / 141.77kB 19.6s done
#33 loading layer afd31ee4b88a 405.66MB / 405.66MB 19.1s done
#33 loading layer 72b5457169d1 17.81MB / 17.81MB 0.9s done
#33 loading layer 365947273ac7 483B / 483B 0.7s done
#33 loading layer 8b08f0cd86e6 311B / 311B 0.6s done
#33 loading layer 724079108c2a 298B / 298B 0.5s done
#33 loading layer 7745de7f2569 3.90kB / 3.90kB 0.5s done
#33 DONE 164.2s
#32 exporting to docker image format
#32 sending tarball 226.2s done
#32 DONE 447.7s
#34 exporting cache to client directory
#34 preparing build cache for export
#34 writing layer sha256:01dbb24602a6492bfd4e66a528f13460639f4379641f6d5d9a5764fd8b929a33
#34 writing layer sha256:01dbb24602a6492bfd4e66a528f13460639f4379641f6d5d9a5764fd8b929a33 0.1s done
#34 writing layer sha256:056e5fea9ff576db67854c0f98fa42ec5b27b7a084c4185a4f4e7637445640df
#34 writing layer sha256:056e5fea9ff576db67854c0f98fa42ec5b27b7a084c4185a4f4e7637445640df 9.0s done
#34 writing layer sha256:07570fd93aa2f5551f918cd92030d4f6f49e9c891d25901554c80136a4455b63
#34 writing layer sha256:07570fd93aa2f5551f918cd92030d4f6f49e9c891d25901554c80136a4455b63 0.5s done
#34 writing layer sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651
#34 writing layer sha256:0acb0bb33f9956b78fbfc026a81d9f3fbcf52f6c3c51ed7ff503b2f5db52d651 2.6s done
#34 writing layer sha256:13e8f87efde86df96bfe73da211eb196d0416702b69d92947ec617138e6db64b
#34 writing layer sha256:13e8f87efde86df96bfe73da211eb196d0416702b69d92947ec617138e6db64b 0.0s done
#34 writing layer sha256:187325367188ecee39028e06ba38d4643146198b0c73ed22276a3a95c6d5a056 0.0s done
#34 writing layer sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338
#34 writing layer sha256:1ba07b1309cf3cbf6f4649e357d9a21e94039b6100973ef20599eb4a11a8b338 28.9s done
#34 writing layer sha256:1d0d0ae70c2710c2734923b3fa133474464425b01045082fb3aa0a48ea6c8817
#34 writing layer sha256:1d0d0ae70c2710c2734923b3fa133474464425b01045082fb3aa0a48ea6c8817 78.8s done
#34 writing layer sha256:32f112e3802cadcab3543160f4d2aa607b3cc1c62140d57b4f5441384f40e927
#34 writing layer sha256:32f112e3802cadcab3543160f4d2aa607b3cc1c62140d57b4f5441384f40e927 0.7s done
#34 writing layer sha256:350975150fe900917041cf4f051e534aa21b2e19a4117e7f5466605130aea18e
#34 writing layer sha256:350975150fe900917041cf4f051e534aa21b2e19a4117e7f5466605130aea18e 0.0s done
#34 writing layer sha256:3cbe008dab298e1242e9a82e7095428a4063a7938cd244b877a8fe6e2a926803 0.0s done
#34 writing layer sha256:43846f52d4e77633dd2172b60046ec25ccec47d34a5e2ad7a4dcf1c4d9d2c188 0.0s done
#34 writing layer sha256:492db7b3e492442f7a1ad30fea534f61ad89da451c675ccab2488e41034d0886 0.0s done
#34 writing layer sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1
#34 writing layer sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 done
#34 writing layer sha256:5aafa836c821b153fce2c5357ac5601ce0f4195675ed0aeea8f611b3b9cd7f27 0.1s done
#34 writing layer sha256:69cf5c7e491e16af81cfc9508eb14f87019049bf3341b20b819a8dcd70b78a8d 0.0s done
#34 writing layer sha256:6ba06822853bad16ce86072266460ad2363e31641ff5e85be04803787a8aa695
#34 writing layer sha256:6ba06822853bad16ce86072266460ad2363e31641ff5e85be04803787a8aa695 0.0s done
#34 writing layer sha256:74ff783cfc1660e3f3e1e81075a25de97b07fad907ca77509ba507ea1d5edf2e 0.0s done
#34 writing layer sha256:81a64790a2ca84cdc6b783fe2af8820ae968d692b68518541b48d405a730fad8 0.0s done
#34 writing layer sha256:84fef9f1ca4f21e9c7411db3c57fe91a1f401d7051d87a3bfed97ff70a2cf72c 0.0s done
#34 writing layer sha256:910884cfc2f77acaf46c98cd83f883dc31c12a54e3b54a3fceb7a71af0ae890e
#34 writing layer sha256:910884cfc2f77acaf46c98cd83f883dc31c12a54e3b54a3fceb7a71af0ae890e 0.9s done
#34 writing layer sha256:932162d4fcf6e1094ee1544e8fde0ae2a02b2c4e9545f64f373ce3a4479189e6
#34 writing layer sha256:932162d4fcf6e1094ee1544e8fde0ae2a02b2c4e9545f64f373ce3a4479189e6 0.0s done
#34 writing layer sha256:96bf0dfae02f8c2f168036610f3d5c148096280e7a5b8d3cf50d454f5b2d5b67 0.0s done
#34 writing layer sha256:9b92275482332aca5b3ab10c2996c40fa2e69fdbb8b2c6f8f38ec3f919ca41e7
#34 writing layer sha256:9b92275482332aca5b3ab10c2996c40fa2e69fdbb8b2c6f8f38ec3f919ca41e7 0.4s done
#34 writing layer sha256:9c9b39ad83d512d5af47e9c22f4458cb586f05ea478656a372c5e739cb7280e5
#34 writing layer sha256:9c9b39ad83d512d5af47e9c22f4458cb586f05ea478656a372c5e739cb7280e5 0.1s done
#34 writing layer sha256:a05e2a2b3985056fa77853b6928b3370ccad98c8497462777f5d434477f63df6
#34 writing layer sha256:a05e2a2b3985056fa77853b6928b3370ccad98c8497462777f5d434477f63df6 0.0s done
#34 writing layer sha256:a1873c23f4f8b5ce90ce14f597e2d9cb97ae53621e8a59cbe73febca4f098653 0.0s done
#34 writing layer sha256:d275366bd0805885c41fbe61b6361f7bbc2f0848c4305e19acd2d6c32d1a0a3e
#34 writing layer sha256:d275366bd0805885c41fbe61b6361f7bbc2f0848c4305e19acd2d6c32d1a0a3e 0.5s done
#34 writing layer sha256:d561590878ab411042992f7e4568bc267aa23391d3869a79bd4bf0e52f877254
#34 preparing build cache for export 123.4s done
#34 writing layer sha256:d561590878ab411042992f7e4568bc267aa23391d3869a79bd4bf0e52f877254 0.0s done
#34 writing layer sha256:ddc61996788ff6833bbe82138d6fc5000e848953b90df5055cbae21479218914 0.0s done
#34 writing layer sha256:f13cbeb7d0a63570c41d3556d86c99fd936dc9cfecd19aaf79987386928db773 0.0s done
#34 writing config sha256:d32f6b23fadf73ef78f9192fbe3cfcf27a3e823e04973f14d926160b33a97252 0.0s done
#34 writing cache manifest sha256:58127de9bdb08ce0994a9eb1dd8a7da5295a88147f7ebd7e2902bba12b9b5052 0.0s done
#34 DONE 123.4s
[2025-10-30 12:24:15,847] [INFO] (packager) - Build Summary:
Platform: x64-workstation/dgpu
Status: Succeeded
Docker Tag: my_app-x64-workstation-dgpu-linux-amd64:1.0
Tarball: None
We can see that the MAP Docker image is created.
We can choose to display and inspect the MAP manifests by running the container with the show command, as well as extracting the manifests and other contents in the MAP by using the extract command, but not demonstrated in this example.
!docker image ls | grep {tag_prefix}
my_app-x64-workstation-dgpu-linux-amd64 1.0 091c1b0dabf9 9 minutes ago 11GB
Executing packaged app locally#
The packaged app can be run locally through MONAI Application Runner.
# Clear the output folder and run the MAP. The input is expected to be a folder.
!echo $HOLOSCAN_OUTPUT_PATH
!echo $HOLOSCAN_INPUT_PATH
!rm -rf $HOLOSCAN_OUTPUT_PATH
!monai-deploy run -i $HOLOSCAN_INPUT_PATH -o $HOLOSCAN_OUTPUT_PATH my_app-x64-workstation-dgpu-linux-amd64:1.0
output
dcm
[2025-10-30 12:24:18,309] [INFO] (runner) - Checking dependencies...
[2025-10-30 12:24:18,309] [INFO] (runner) - --> Verifying if "docker" is installed...
[2025-10-30 12:24:18,309] [INFO] (runner) - --> Verifying if "docker-buildx" is installed...
[2025-10-30 12:24:18,310] [INFO] (runner) - --> Verifying if "my_app-x64-workstation-dgpu-linux-amd64:1.0" is available...
[2025-10-30 12:24:18,430] [INFO] (runner) - Reading HAP/MAP manifest...
Successfully copied 2.56kB to /tmp/tmpo9i84mva/app.json
Successfully copied 2.05kB to /tmp/tmpo9i84mva/pkg.json
7de2dd97da25b2da6ec714dc954b9bdd07b00af669c9f14b58c0605681673d11
[2025-10-30 12:24:19,131] [INFO] (runner) - --> Verifying if "nvidia-ctk" is installed...
[2025-10-30 12:24:19,132] [INFO] (runner) - --> Verifying "nvidia-ctk" version...
[2025-10-30 12:24:19,830] [INFO] (common) - Launching container (68cbb8952837) using image 'my_app-x64-workstation-dgpu-linux-amd64:1.0'...
container name: agitated_wozniak
host name: mingq-dt
network: host
user: 1000:1000
ulimits: memlock=-1:-1, stack=67108864:67108864
cap_add: CAP_SYS_PTRACE
ipc mode: host
shared memory size: 67108864
devices:
group_add: 44
2025-10-30 19:24:20 [INFO] Launching application python3 /opt/holoscan/app ...
/home/holoscan/.local/lib/python3.12/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.
import pkg_resources
[info] [fragment.cpp:969] Loading extensions from configs...
[info] [gxf_executor.cpp:344] Creating context
[2025-10-30 19:24:24,662] [INFO] (root) - Parsed args: Namespace(log_level=None, input=None, output=None, model=None, workdir=None, triton_server_netloc=None, argv=['/opt/holoscan/app'])
[2025-10-30 19:24:24,664] [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=
[2025-10-30 19:24:24,664] [INFO] (app.AISpleenSegApp) - App input and output path: /var/holoscan/input, /var/holoscan/output
[info] [gxf_executor.cpp:2508] Activating Graph...
[info] [gxf_executor.cpp:2579] Running Graph...
[info] [gxf_executor.cpp:2581] Waiting for completion...
[info] [greedy_scheduler.cpp:191] Scheduling 5 entities
[2025-10-30 19:24:24,818] [INFO] (monai.deploy.operators.dicom_data_loader_operator.DICOMDataLoaderOperator) - No or invalid input path from the optional input port: None
[2025-10-30 19:24:25,629] [INFO] (root) - Finding series for Selection named: CT Series
[2025-10-30 19:24:25,629] [INFO] (root) - Searching study, : 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291
# of series: 1
[2025-10-30 19:24:25,629] [INFO] (root) - Working on series, instance UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239
[2025-10-30 19:24:25,629] [INFO] (root) - On attribute: 'StudyDescription' to match value: '(.*?)'
[2025-10-30 19:24:25,629] [INFO] (root) - Series attribute StudyDescription value: CT ABDOMEN W IV CONTRAST
[2025-10-30 19:24:25,630] [INFO] (root) - On attribute: 'Modality' to match value: '(?i)CT'
[2025-10-30 19:24:25,630] [INFO] (root) - Series attribute Modality value: CT
[2025-10-30 19:24:25,630] [INFO] (root) - On attribute: 'SeriesDescription' to match value: '(.*?)'
[2025-10-30 19:24:25,630] [INFO] (root) - Series attribute SeriesDescription value: ABD/PANC 3.0 B31f
[2025-10-30 19:24:25,630] [INFO] (root) - On attribute: 'ImageType' to match value: ['PRIMARY', 'ORIGINAL']
[2025-10-30 19:24:25,630] [INFO] (root) - Series attribute ImageType value: None
[2025-10-30 19:24:25,630] [INFO] (root) - Instance level attribute ImageType value: ["['ORIGINAL', 'PRIMARY', 'AXIAL', 'CT_SOM5 SPI']"]
[2025-10-30 19:24:25,630] [INFO] (root) - Selected Series, UID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239
[2025-10-30 19:24:25,630] [INFO] (root) - Series Selection finalized
[2025-10-30 19:24:25,630] [INFO] (root) - Series Description of selected DICOM Series for inference: ABD/PANC 3.0 B31f
[2025-10-30 19:24:25,630] [INFO] (root) - Series Instance UID of selected DICOM Series for inference: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239
/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.
warn_deprecated(argname, msg, warning_category)
[2025-10-30 19:24:25,966] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Converted Image object metadata:
[2025-10-30 19:24:25,966] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesInstanceUID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.119403521930927333027265674239, type <class 'str'>
[2025-10-30 19:24:25,966] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesDate: 20090831, type <class 'str'>
[2025-10-30 19:24:25,966] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesTime: 101721.452, type <class 'str'>
[2025-10-30 19:24:25,966] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Modality: CT, type <class 'str'>
[2025-10-30 19:24:25,966] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesDescription: ABD/PANC 3.0 B31f, type <class 'str'>
[2025-10-30 19:24:25,966] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - PatientPosition: HFS, type <class 'str'>
[2025-10-30 19:24:25,966] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - SeriesNumber: 8, type <class 'int'>
[2025-10-30 19:24:25,966] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - row_pixel_spacing: 0.7890625, type <class 'float'>
[2025-10-30 19:24:25,967] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - col_pixel_spacing: 0.7890625, type <class 'float'>
[2025-10-30 19:24:25,967] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - depth_pixel_spacing: 1.5, type <class 'float'>
[2025-10-30 19:24:25,967] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - row_direction_cosine: [1.0, 0.0, 0.0], type <class 'list'>
[2025-10-30 19:24:25,967] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - col_direction_cosine: [0.0, 1.0, 0.0], type <class 'list'>
[2025-10-30 19:24:25,967] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - depth_direction_cosine: [0.0, 0.0, 1.0], type <class 'list'>
[2025-10-30 19:24:25,967] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - dicom_affine_transform: [[ 0.7890625 0. 0. -197.60547 ]
[ 0. 0.7890625 0. -398.60547 ]
[ 0. 0. 1.5 -383. ]
[ 0. 0. 0. 1. ]], type <class 'numpy.ndarray'>
[2025-10-30 19:24:25,968] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - nifti_affine_transform: [[ -0.7890625 -0. -0. 197.60547 ]
[ -0. -0.7890625 -0. 398.60547 ]
[ 0. 0. 1.5 -383. ]
[ 0. 0. 0. 1. ]], type <class 'numpy.ndarray'>
[2025-10-30 19:24:25,968] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyInstanceUID: 1.3.6.1.4.1.14519.5.2.1.7085.2626.822645453932810382886582736291, type <class 'str'>
[2025-10-30 19:24:25,968] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyID: , type <class 'str'>
[2025-10-30 19:24:25,968] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyDate: 20090831, type <class 'str'>
[2025-10-30 19:24:25,968] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyTime: 095948.599, type <class 'str'>
[2025-10-30 19:24:25,968] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - StudyDescription: CT ABDOMEN W IV CONTRAST, type <class 'str'>
[2025-10-30 19:24:25,968] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - AccessionNumber: 5471978513296937, type <class 'str'>
[2025-10-30 19:24:25,968] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - selection_name: CT Series, type <class 'str'>
[2025-10-30 19:24:25,968] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - affine: [[ -0.7890625 -0. -0. 197.60547 ]
[ -0. -0.7890625 -0. 398.60547 ]
[ 0. 0. 1.5 -383. ]
[ 0. 0. 0. 1. ]], type <class 'numpy.ndarray'>
[2025-10-30 19:24:25,968] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - space: RAS, type <class 'str'>
2025-10-30 19:24:26,606 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
[2025-10-30 19:24:28,296] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Input of <class 'monai.data.meta_tensor.MetaTensor'> shape: torch.Size([1, 1, 270, 270, 106])
/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:345.)
win_data = torch.cat([inputs[win_slice] for win_slice in unravel_slice]).to(sw_device)
/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:345.)
out[idx_zm] += p
2025-10-30 19:24:29,704 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
[2025-10-30 19:24:31,143] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform length/batch size of output: 1
[2025-10-30 19:24:31,144] [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)
[2025-10-30 19:24:31,270] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Post transform pred of <class 'numpy.ndarray'> shape: (1, 512, 512, 204)
[2025-10-30 19:24:31,308] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Output Seg image numpy array of type <class 'numpy.ndarray'> shape: (204, 512, 512)
[2025-10-30 19:24:31,312] [INFO] (monai.deploy.operators.monai_seg_inference_operator.MonaiSegInferenceOperator) - Output Seg image pixel max value: 1
/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.
check_person_name(patient_name)
[2025-10-30 19:24:32,225] [INFO] (highdicom.base) - copy Image-related attributes from dataset "1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191"
[2025-10-30 19:24:32,226] [INFO] (highdicom.base) - copy attributes of module "Specimen"
[2025-10-30 19:24:32,226] [INFO] (highdicom.base) - copy Patient-related attributes from dataset "1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191"
[2025-10-30 19:24:32,226] [INFO] (highdicom.base) - copy attributes of module "Patient"
[2025-10-30 19:24:32,226] [INFO] (highdicom.base) - copy attributes of module "Clinical Trial Subject"
[2025-10-30 19:24:32,226] [INFO] (highdicom.base) - copy Study-related attributes from dataset "1.3.6.1.4.1.14519.5.2.1.7085.2626.936983343951485811186213470191"
[2025-10-30 19:24:32,226] [INFO] (highdicom.base) - copy attributes of module "General Study"
[2025-10-30 19:24:32,226] [INFO] (highdicom.base) - copy attributes of module "Patient Study"
[2025-10-30 19:24:32,226] [INFO] (highdicom.base) - copy attributes of module "Clinical Trial Study"
[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.
[info] [greedy_scheduler.cpp:401] Scheduler finished.
[info] [gxf_executor.cpp:2588] Deactivating Graph...
[info] [gxf_executor.cpp:2597] Graph execution finished.
[2025-10-30 19:24:32,303] [INFO] (app.AISpleenSegApp) - End run
[info] [gxf_executor.cpp:379] Destroying context
2025-10-30 19:24:33 [INFO] Application exited with 0.
[2025-10-30 12:24:35,481] [INFO] (common) - Container 'agitated_wozniak'(68cbb8952837) exited with code 0.
!ls -R $HOLOSCAN_OUTPUT_PATH
output:
1.2.826.0.1.3680043.10.511.3.79884456519089834616076829263540444.dcm
saved_images_folder
output/saved_images_folder:
1.3.6.1.4.1.14519.5.2.1.7085.2626
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
1.3.6.1.4.1.14519.5.2.1.7085.2626_seg.nii