Skip to content

Local debugging of azure ml online deployments using arm64-based image #10386

Description

@LukaFiederer

Describe the bug

Expected Behavior

I expect to be able to follow https://learn.microsoft.com/en-us/azure/machine-learning/how-to-debug-managed-online-endpoints-visual-studio-code?view=azureml-api-2&tabs=cli and get an arm64-based local debugging environment.

Actual Behavior

I get a amd64-based local debugging environment, which on apple silicon is unusable performance-wise

Steps to Reproduce the Problem

  1. follow https://learn.microsoft.com/en-us/azure/machine-learning/how-to-debug-managed-online-endpoints-visual-studio-code?view=azureml-api-2&tabs=cli on arm64 system to get amd64-based local debugging env. Too slow for LLMs
  2. change https://github.com/Azure/azureml-examples/blob/86d53a35d2ecc33ff40c669cc1389b06899e5a4b/cli/endpoints/online/managed/sample/blue-deployment.yml#L11 to a conda-enabled arm64-based image like condaforge/miniforge3:latest and get an arm64-based local debugging environment. Fast enough for LLMs, but the debugger is unable to attach. Debug logs of the creation process attached. VSCode logs attached in errors section (but no errors visible)

Specifications

  • Version:
az --version
azure-cli                         2.90.0

core                              2.90.0
telemetry                          1.1.0

Extensions:
ml                                2.45.0

Dependencies:
msal                              1.36.0
azure-mgmt-resource               24.0.0
  • Platform: Apple M5 Pro

Related command

az ml online-deployment create --file endpoints/online/managed/sample/blue-deployment.yml --local --vscode-debug

Errors

2026-09-23 10:00:53.252 [info] DAP Server launched with command: /opt/conda/bin/python /root/.vscode-server/extensions/ms-python.debugpy-2026.6.0/bundled/libs/debugpy/adapter
2026-09-23 10:01:04.969 [info] Native locator: Refresh started
2026-09-23 10:01:04.980 [info] Conda environment manager found at: /opt/conda/bin/conda
2026-09-23 10:01:04.980 [info] Conda set to: /opt/conda/bin/conda
2026-09-23 10:01:04.980 [warning] Unknown environment manager: Mamba
2026-09-23 10:01:04.982 [info] Native locator: Refresh finished in 13 ms
2026-09-23 10:01:06.770 [info] Active interpreter [/var/azureml-app/onlinescoring]:  /opt/conda/envs/inf-conda-env/bin/python
2026-09-23 10:01:06.797 [info] > /opt/conda/bin/conda info --json
2026-09-23 10:01:07.235 [info] Python interpreter path: /opt/conda/envs/inf-conda-env/bin/python
2026-09-23 10:01:07.570 [info] Starting Jedi language server for onlinescoring.

Issue script & Debug output

% az ml online-deployment create --file endpoints/online/managed/sample/blue-deployment.yml --local --vscode-debug --debug
cli.knack.cli: Command arguments: ['ml', 'online-deployment', 'create', '--file', 'endpoints/online/managed/sample/blue-deployment.yml', '--local', '--vscode-debug',  '--debug']
cli.knack.cli: __init__ debug log:
Enable color in terminal.
cli.knack.cli: Event: Cli.PreExecute []
cli.knack.cli: Event: CommandParser.OnGlobalArgumentsCreate [<function CLILogging.on_global_arguments at 0x107d4c9e0>, <function OutputProducer.on_global_arguments at 0x107e6ab90>, <function CLIQuery.on_global_arguments at 0x107ea1380>]
cli.knack.cli: Event: CommandInvoker.OnPreCommandTableCreate []
cli.azure.cli.core: Using packaged command index for profile 'latest'.
cli.azure.cli.core: Found installed extension 'ml' (azext_mlv2).
cli.azure.cli.core: Blending packaged core index with local extension index.
cli.azure.cli.core: Modules found from index for 'ml': ['azext_mlv2']
cli.azure.cli.core: Loading command modules...
cli.azure.cli.core: Name                  Load Time    Groups  Commands
cli.azure.cli.core: Loaded command modules:
cli.azure.cli.core: Total (0)                 0.000         0         0
cli.azure.cli.core: These extensions are not installed and will be skipped: ['azext_ai_examples', 'azext_next']
cli.azure.cli.core: Loading extensions:
cli.azure.cli.core: Name                  Load Time    Groups  Commands  Directory
azure.ai.ml._azure_environments: Using the default cloud configuration: 'AzureCloud'.
azure.ai.ml._azure_environments: Using the default cloud configuration: 'AzureCloud'.
azure.ai.ml._azure_environments: Using the default cloud configuration: 'AzureCloud'.
cli.azure.cli.core: ml                        0.849        26       171  /Users/<user>/.azure/cliextensions/ml
cli.azure.cli.core: Total (1)                 0.849        26       171
cli.azure.cli.core: Loaded 26 groups, 171 commands.
cli.azure.cli.core: Found a match in the command table.
cli.azure.cli.core: Raw command  : ml online-deployment create
cli.azure.cli.core: Command table: ml online-deployment create
cli.knack.cli: Event: CommandInvoker.OnPreCommandTableTruncate [<function AzCliLogging.init_command_file_logging at 0x10808d010>]
cli.azure.cli.core.azlogging: metadata file logging enabled - writing logs to '/Users/<user>/.azure/commands/2026-09-23.11-42-57.ml_online-deployment_create.98212.log'.
az_command_data_logger: command args: ml online-deployment create --file {} --local --vscode-debug --subscription {} --resource-group {} --workspace-name {} --debug
cli.knack.cli: Event: CommandInvoker.OnPreArgumentLoad [<function register_global_subscription_argument.<locals>.add_subscription_parameter at 0x10810d2d0>]
cli.knack.cli: Event: CommandInvoker.OnPostArgumentLoad []
cli.knack.cli: Event: CommandInvoker.OnPostCommandTableCreate [<function register_ids_argument.<locals>.add_ids_arguments at 0x10810ecf0>, <function register_global_policy_argument.<locals>.add_global_policy_argument at 0x108135fe0>, <function register_cache_arguments.<locals>.add_cache_arguments at 0x108136090>, <function register_upcoming_breaking_change_info.<locals>.update_breaking_change_info at 0x108136140>]
cli.knack.cli: Event: CommandInvoker.OnCommandTableLoaded []
cli.knack.cli: Event: CommandInvoker.OnPreParseArgs []
cli.knack.cli: Event: CommandInvoker.OnPostParseArgs [<function OutputProducer.handle_output_argument at 0x107e6ac40>, <function CLIQuery.handle_query_parameter at 0x107ea1430>, <function register_ids_argument.<locals>.parse_ids_arguments at 0x108135f30>]
az_command_data_logger: extension name: ml
az_command_data_logger: extension version: 2.45.0
cli.azure.cli.core.commands.client_factory: Getting management service client client_type=MachineLearningServicesMgmtClient
cli.azure.cli.core.auth.persistence: build_persistence: location='/Users/<user>/.azure/msal_token_cache.json', encrypt=False
cli.azure.cli.core.auth.binary_cache: load: /Users/<user>/.azure/msal_http_cache.bin
urllib3.util.retry: Converted retries value: 1 -> Retry(total=1, connect=None, read=None, redirect=None, status=None)
msal.application: Broker enabled? None
cli.azure.cli.core.commands.client_factory: Getting management service client client_type=_ml_client_cli
urllib3.util.retry: Converted retries value: 1 -> Retry(total=1, connect=None, read=None, redirect=None, status=None)
msal.application: Broker enabled? None
docker.utils.config: Trying paths: ['/Users/<user>/.docker/config.json', '/Users/<user>/.dockercfg']
docker.utils.config: Found file at path: /Users/<user>/.docker/config.json
docker.utils.config: Trying paths: ['/Users/<user>/.docker/config.json', '/Users/<user>/.dockercfg']
docker.utils.config: Found file at path: /Users/<user>/.docker/config.json
docker.utils.config: Trying paths: ['/Users/<user>/.docker/config.json', '/Users/<user>/.dockercfg']
docker.utils.config: Found file at path: /Users/<user>/.docker/config.json
docker.utils.config: Trying paths: ['/Users/<user>/.docker/config.json', '/Users/<user>/.dockercfg']
docker.utils.config: Found file at path: /Users/<user>/.docker/config.json
docker.utils.config: Trying paths: ['/Users/<user>/.docker/config.json', '/Users/<user>/.dockercfg']
docker.utils.config: Found file at path: /Users/<user>/.docker/config.json
docker.auth: Found 'credsStore' section
urllib3.connectionpool: http://localhost:None "GET /version HTTP/1.1" 200 None
urllib3.connectionpool: http://localhost:None "GET /v1.56/containers/json?limit=-1&all=1&size=0&trunc_cmd=0&filters=%7B%22label%22%3A+%5B%22azureml-local-endpoint%22%2C+%22endpoint%3Dmy-endpoint%22%2C+%22deployment%3Dblue%22%5D%7D HTTP/1.1" 200 None
urllib3.connectionpool: http://localhost:None "GET /v1.56/containers/json?limit=-1&all=1&size=0&trunc_cmd=0&filters=%7B%22label%22%3A+%5B%22azureml-local-endpoint%22%2C+%22endpoint%3Dmy-endpoint%22%2C+%22deployment%3Dblue%22%5D%7D HTTP/1.1" 200 None
Class DeploymentTemplateReferenceSchema: This is an experimental class, and may change at any time. Please see https://aka.ms/azuremlexperimental for more information.
Creating local deployment (my-endpoint / blue) .
Building Docker image from Dockerfiledocker.api.build: Looking for auth config
docker.auth: Looking for auth entry for 'https://dhi.io'
docker.auth: Looking for auth entry for 'https://index.docker.io/v1/'
docker.auth: Looking for auth entry for 'https://index.docker.io/v1/access-token'
docker.auth: Looking for auth entry for 'https://index.docker.io/v1/refresh-token'
docker.api.build: Sending auth config ('https://dhi.io', 'dhi.io', 'https://index.docker.io/v1/', 'index.docker.io', 'https://index.docker.io/v1/access-token', 'https://index.docker.io/v1/refresh-token')
urllib3.connectionpool: http://localhost:None "POST /v1.56/build?t=my-endpoint%3Ablue&q=False&nocache=False&rm=False&forcerm=False&pull=True&dockerfile=Dockerfile HTTP/1.1" 200 None

Step 1/7 : FROM condaforge/miniforge3:latest
...... ---> 3a41fcca7d67
Step 2/7 : RUN mkdir -p /var/azureml-app/
 ---> Running in 77109b81ff79
 ---> 1901db594456
Step 3/7 : WORKDIR /var/azureml-app/
 ---> Running in a303ce435f22
 ---> 5a6edf2dd29d
Step 4/7 : COPY conda.yml /var/azureml-app/
 ---> 7d6b55d98f27
Step 5/7 : RUN conda env create -n inf-conda-env --file conda.yml
 ---> Running in 11675f5422b1
.Retrieving notices: ...working... done
Channels:
 - conda-forge
Platform: linux-aarch64
Collecting package metadata (repodata.json): ...working... done
Solving environment: ...working... done
.
## Package Plan ##

  environment location: /opt/conda/envs/inf-conda-env

  added / updated specs:
    - numpy=2.3.1
    - pip=25.1.1
    - python=3.12
    - scikit-learn=1.7.0
    - scipy=1.16.0


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    _openmp_mutex-4.5          |           20_gnu          28 KB  conda-forge
    bzip2-1.0.8                |      h4777abc_10         190 KB  conda-forge
    ca-certificates-2026.7.22  |       hbd8a1cb_0         129 KB  conda-forge
    cloudpickle-3.1.2          |     pyhcf101f3_1          27 KB  conda-forge
    icu-78.3                   |  py311h3512406_2        14.0 MB  conda-forge
    joblib-1.6.0               |     pyhcf101f3_0         223 KB  conda-forge
    ld_impl_linux-aarch64-2.46.1|default_h1979696_102         884 KB  conda-forge
    libblas-3.11.0             |11_haddc8a3_openblas          18 KB  conda-forge
    libcblas-3.11.0            |11_hd72aa62_openblas          18 KB  conda-forge
    libexpat-2.8.4             |       h4154aff_0          77 KB  conda-forge
    libffi-3.7.0               |       hdaad0be_1          62 KB  conda-forge
    libgcc-16.2.0              |       h205dda4_5         613 KB  conda-forge
    libgfortran-16.2.0         |       he9431aa_5          28 KB  conda-forge
    libgfortran5-16.2.0        |       hc864f27_5         1.4 MB  conda-forge
    libgomp-16.2.0             |       h8acb6b2_5         603 KB  conda-forge
    liblapack-3.11.0           |11_h88aeb00_openblas          18 KB  conda-forge
    liblzma-5.8.3              |       he30d5cf_1         123 KB  conda-forge
    libnsl-2.0.1               |       h86ecc28_1          34 KB  conda-forge
    libopenblas-0.3.34         |pthreads_h4148b7d_2         5.6 MB  conda-forge
    libpython-3.12.14          |hc3dd739_3_cpython         7.9 MB  conda-forge
    libsqlite-3.53.4           |       h399dd60_1         950 KB  conda-forge
    libstdcxx-16.2.0           |       hef695bb_5         5.9 MB  conda-forge
    libuuid-2.42.4             |       hd6fdeab_0          35 KB  conda-forge
    libxcrypt-4.4.38           |       h80f16a2_0         131 KB  conda-forge
    libzlib-1.3.2              |       hdc9db2a_3          68 KB  conda-forge
    ncurses-6.6                |       h2b6f883_1         933 KB  conda-forge
    numpy-2.3.1                |  py312h6615c27_1         7.3 MB  conda-forge
    openssl-3.6.4              |       he6ad1d5_0         3.5 MB  conda-forge
    packaging-26.3             |     pyhc364b38_0         114 KB  conda-forge
    pip-25.1.1                 |     pyh8b19718_0         1.2 MB  conda-forge
    python-3.12.14             |h94ad73b_3_cpython        21.4 MB  conda-forge
    python_abi-3.12            |          9_cp312           7 KB  conda-forge
    readline-8.3               |       ha7194a6_1         356 KB  conda-forge
    scikit-learn-1.7.0         |  py312h2605d20_1         9.7 MB  conda-forge
    scipy-1.16.0               |  py312h0aa5eff_0        15.3 MB  conda-forge
    setuptools-84.0.0          |     pyh332efcf_0         512 KB  conda-forge
    threadpoolctl-3.7.0        |     pyhc455866_0          31 KB  conda-forge
    tk-8.6.13                  | noxft_hf03c496_4         3.5 MB  conda-forge
    tzdata-2026c               |       h151e31d_0         116 KB  conda-forge
    wheel-0.48.0               |     pyhd8ed1ab_0          34 KB  conda-forge
    zstd-1.5.7                 |       h9d15635_7         601 KB  conda-forge
    ------------------------------------------------------------
                                           Total:       103.5 MB

The following NEW packages will be INSTALLED:

  _openmp_mutex      conda-forge/linux-aarch64::_openmp_mutex-4.5-20_gnu
  bzip2              conda-forge/linux-aarch64::bzip2-1.0.8-h4777abc_10
  ca-certificates    conda-forge/noarch::ca-certificates-2026.7.22-hbd8a1cb_0
  cloudpickle        conda-forge/noarch::cloudpickle-3.1.2-pyhcf101f3_1
  icu                conda-forge/linux-aarch64::icu-78.3-py311h3512406_2
  joblib             conda-forge/noarch::joblib-1.6.0-pyhcf101f3_0
  ld_impl_linux-aar~ conda-forge/linux-aarch64::ld_impl_linux-aarch64-2.46.1-default_h1979696_102
  libblas            conda-forge/linux-aarch64::libblas-3.11.0-11_haddc8a3_openblas
  libcblas           conda-forge/linux-aarch64::libcblas-3.11.0-11_hd72aa62_openblas
  libexpat           conda-forge/linux-aarch64::libexpat-2.8.4-h4154aff_0
  libffi             conda-forge/linux-aarch64::libffi-3.7.0-hdaad0be_1
  libgcc             conda-forge/linux-aarch64::libgcc-16.2.0-h205dda4_5
  libgfortran        conda-forge/linux-aarch64::libgfortran-16.2.0-he9431aa_5
  libgfortran5       conda-forge/linux-aarch64::libgfortran5-16.2.0-hc864f27_5
  libgomp            conda-forge/linux-aarch64::libgomp-16.2.0-h8acb6b2_5
  liblapack          conda-forge/linux-aarch64::liblapack-3.11.0-11_h88aeb00_openblas
  liblzma            conda-forge/linux-aarch64::liblzma-5.8.3-he30d5cf_1
  libnsl             conda-forge/linux-aarch64::libnsl-2.0.1-h86ecc28_1
  libopenblas        conda-forge/linux-aarch64::libopenblas-0.3.34-pthreads_h4148b7d_2
  libpython          conda-forge/linux-aarch64::libpython-3.12.14-hc3dd739_3_cpython
  libsqlite          conda-forge/linux-aarch64::libsqlite-3.53.4-h399dd60_1
  libstdcxx          conda-forge/linux-aarch64::libstdcxx-16.2.0-hef695bb_5
  libuuid            conda-forge/linux-aarch64::libuuid-2.42.4-hd6fdeab_0
  libxcrypt          conda-forge/linux-aarch64::libxcrypt-4.4.38-h80f16a2_0
  libzlib            conda-forge/linux-aarch64::libzlib-1.3.2-hdc9db2a_3
  ncurses            conda-forge/linux-aarch64::ncurses-6.6-h2b6f883_1
  numpy              conda-forge/linux-aarch64::numpy-2.3.1-py312h6615c27_1
  openssl            conda-forge/linux-aarch64::openssl-3.6.4-he6ad1d5_0
  packaging          conda-forge/noarch::packaging-26.3-pyhc364b38_0
  pip                conda-forge/noarch::pip-25.1.1-pyh8b19718_0
  python             conda-forge/linux-aarch64::python-3.12.14-h94ad73b_3_cpython
  python_abi         conda-forge/noarch::python_abi-3.12-9_cp312
  readline           conda-forge/linux-aarch64::readline-8.3-ha7194a6_1
  scikit-learn       conda-forge/linux-aarch64::scikit-learn-1.7.0-py312h2605d20_1
  scipy              conda-forge/linux-aarch64::scipy-1.16.0-py312h0aa5eff_0
  setuptools         conda-forge/noarch::setuptools-84.0.0-pyh332efcf_0
  threadpoolctl      conda-forge/noarch::threadpoolctl-3.7.0-pyhc455866_0
  tk                 conda-forge/linux-aarch64::tk-8.6.13-noxft_hf03c496_4
  tzdata             conda-forge/noarch::tzdata-2026c-h151e31d_0
  wheel              conda-forge/noarch::wheel-0.48.0-pyhd8ed1ab_0
  zstd               conda-forge/linux-aarch64::zstd-1.5.7-h9d15635_7



Downloading and Extracting Packages: ...working..... done
Preparing transaction: ...working... done
Verifying transaction: ...working... done
Executing transaction: ...working... .done
Installing pip dependencies: ...working... .Ran pip subprocess with arguments:
['/opt/conda/envs/inf-conda-env/bin/python', '-m', 'pip', 'install', '-U', '-r', '/var/azureml-app/condaenv.if6bjzzr.requirements.txt', '--exists-action=b']
Pip subprocess output:
Collecting azureml-inference-server-http==1.4.1 (from -r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading azureml_inference_server_http-1.4.1-py3-none-any.whl.metadata (12 kB)
Requirement already satisfied: joblib in /opt/conda/envs/inf-conda-env/lib/python3.12/site-packages (from -r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 3)) (1.6.0)
Collecting inference-schema[numpy-support] (from -r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 2))
  Downloading inference_schema-1.8-py3-none-any.whl.metadata (2.5 kB)
Collecting flask~=3.1.0 (from azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading flask-3.1.3-py3-none-any.whl.metadata (3.2 kB)
Collecting flask-cors~=6.0.0 (from azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading flask_cors-6.0.5-py3-none-any.whl.metadata (5.4 kB)
Collecting gunicorn>=23.0.0 (from azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading gunicorn-26.2.0-py3-none-any.whl.metadata (5.5 kB)
Collecting opencensus-ext-azure~=1.1.0 (from azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading opencensus_ext_azure-1.1.15-py2.py3-none-any.whl.metadata (17 kB)
Collecting pydantic~=2.11.0 (from azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading pydantic-2.11.10-py3-none-any.whl.metadata (68 kB)
Collecting pydantic-settings (from azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading pydantic_settings-2.15.0-py3-none-any.whl.metadata (3.9 kB)
Collecting werkzeug>=3.0.3 (from azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading werkzeug-3.1.8-py3-none-any.whl.metadata (4.0 kB)
Collecting certifi>=2024.7.4 (from azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading certifi-2026.7.22-py3-none-any.whl.metadata (2.5 kB)
Collecting blinker>=1.9.0 (from flask~=3.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading blinker-1.9.0-py3-none-any.whl.metadata (1.6 kB)
Collecting click>=8.1.3 (from flask~=3.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading click-8.5.0-py3-none-any.whl.metadata (2.6 kB)
Collecting itsdangerous>=2.2.0 (from flask~=3.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading itsdangerous-2.2.0-py3-none-any.whl.metadata (1.9 kB)
Collecting jinja2>=3.1.2 (from flask~=3.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB)
Collecting markupsafe>=2.1.1 (from flask~=3.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (2.7 kB)
Collecting python-dateutil>=2.5.3 (from inference-schema[numpy-support]->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 2))
  Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB)
Collecting pytz>=2017.2 (from inference-schema[numpy-support]->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 2))
  Downloading pytz-2026.3.post1-py2.py3-none-any.whl.metadata (22 kB)
Collecting wrapt<=1.16.0,>=1.14.0 (from inference-schema[numpy-support]->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 2))
  Downloading wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (6.6 kB)
Collecting azure-core<2.0.0,>=1.12.0 (from opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading azure_core-1.41.0-py3-none-any.whl.metadata (49 kB)
Collecting azure-identity<2.0.0,>=1.5.0 (from opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading azure_identity-1.25.3-py3-none-any.whl.metadata (91 kB)
Collecting opencensus<1.0.0,>=0.11.4 (from opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading opencensus-0.11.4-py2.py3-none-any.whl.metadata (12 kB)
Collecting psutil>=5.6.3 (from opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (22 kB)
Collecting requests>=2.19.0 (from opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading requests-2.34.2-py3-none-any.whl.metadata (4.8 kB)
Collecting typing-extensions>=4.6.0 (from azure-core<2.0.0,>=1.12.0->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading typing_extensions-4.16.0-py3-none-any.whl.metadata (3.3 kB)
Collecting cryptography>=2.5 (from azure-identity<2.0.0,>=1.5.0->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading cryptography-50.0.1-cp311-abi3-manylinux_2_34_aarch64.whl.metadata (4.3 kB)
Collecting msal>=1.35.1 (from azure-identity<2.0.0,>=1.5.0->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading msal-1.39.0-py3-none-any.whl.metadata (11 kB)
Collecting msal-extensions>=1.2.0 (from azure-identity<2.0.0,>=1.5.0->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading msal_extensions-1.3.1-py3-none-any.whl.metadata (7.8 kB)
Collecting opencensus-context>=0.1.3 (from opencensus<1.0.0,>=0.11.4->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading opencensus_context-0.1.3-py2.py3-none-any.whl.metadata (3.3 kB)
Collecting six~=1.16 (from opencensus<1.0.0,>=0.11.4->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB)
Collecting google-api-core<3.0.0,>=1.0.0 (from opencensus<1.0.0,>=0.11.4->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading google_api_core-2.38.0-py3-none-any.whl.metadata (3.2 kB)
Collecting googleapis-common-protos<2.0.0,>=1.69.2 (from google-api-core<3.0.0,>=1.0.0->opencensus<1.0.0,>=0.11.4->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading googleapis_common_protos-1.75.3-py3-none-any.whl.metadata (8.5 kB)
Collecting protobuf<8.0.0,>=6.33.5 (from google-api-core<3.0.0,>=1.0.0->opencensus<1.0.0,>=0.11.4->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading protobuf-7.36.2-cp310-abi3-manylinux2014_aarch64.whl.metadata (595 bytes)
Collecting proto-plus<2.0.0,>=1.26.1 (from google-api-core<3.0.0,>=1.0.0->opencensus<1.0.0,>=0.11.4->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading proto_plus-1.28.4-py3-none-any.whl.metadata (2.2 kB)
Collecting google-auth<3.0.0,>=2.14.1 (from google-api-core<3.0.0,>=1.0.0->opencensus<1.0.0,>=0.11.4->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading google_auth-2.58.0-py3-none-any.whl.metadata (6.0 kB)
Collecting opentelemetry-api<2.0.0,>=1.44.0 (from google-api-core<3.0.0,>=1.0.0->opencensus<1.0.0,>=0.11.4->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading opentelemetry_api-1.44.0-py3-none-any.whl.metadata (1.4 kB)
Collecting pyasn1-modules>=0.2.1 (from google-auth<3.0.0,>=2.14.1->google-api-core<3.0.0,>=1.0.0->opencensus<1.0.0,>=0.11.4->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading pyasn1_modules-0.4.2-py3-none-any.whl.metadata (3.5 kB)
Collecting annotated-types>=0.6.0 (from pydantic~=2.11.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading annotated_types-0.8.0-py3-none-any.whl.metadata (15 kB)
Collecting pydantic-core==2.33.2 (from pydantic~=2.11.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (6.8 kB)
Collecting typing-inspection>=0.4.0 (from pydantic~=2.11.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading typing_inspection-0.4.4-py3-none-any.whl.metadata (2.6 kB)
Collecting charset_normalizer<4,>=2 (from requests>=2.19.0->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (45 kB)
Collecting idna<4,>=2.5 (from requests>=2.19.0->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading idna-3.20-py3-none-any.whl.metadata (7.2 kB)
Collecting urllib3<3,>=1.26 (from requests>=2.19.0->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading urllib3-2.8.0-py3-none-any.whl.metadata (7.4 kB)
Requirement already satisfied: numpy>=1.13.0 in /opt/conda/envs/inf-conda-env/lib/python3.12/site-packages (from inference-schema[numpy-support]->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 2)) (2.3.1)
Requirement already satisfied: cloudpickle>=3.0 in /opt/conda/envs/inf-conda-env/lib/python3.12/site-packages (from joblib->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 3)) (3.1.2)
Collecting cffi>=2.0.0 (from cryptography>=2.5->azure-identity<2.0.0,>=1.5.0->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.metadata (2.5 kB)
Collecting pycparser (from cffi>=2.0.0->cryptography>=2.5->azure-identity<2.0.0,>=1.5.0->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading pycparser-3.0-py3-none-any.whl.metadata (8.2 kB)
Collecting PyJWT<3,>=1.0.0 (from PyJWT[crypto]<3,>=1.0.0->msal>=1.35.1->azure-identity<2.0.0,>=1.5.0->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading pyjwt-2.14.0-py3-none-any.whl.metadata (3.4 kB)
Collecting pyasn1<0.7.0,>=0.6.1 (from pyasn1-modules>=0.2.1->google-auth<3.0.0,>=2.14.1->google-api-core<3.0.0,>=1.0.0->opencensus<1.0.0,>=0.11.4->opencensus-ext-azure~=1.1.0->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading pyasn1-0.6.4-py3-none-any.whl.metadata (8.4 kB)
Collecting python-dotenv>=0.21.0 (from pydantic-settings->azureml-inference-server-http==1.4.1->-r /var/azureml-app/condaenv.if6bjzzr.requirements.txt (line 1))
  Downloading python_dotenv-1.2.3-py3-none-any.whl.metadata (29 kB)
Downloading azureml_inference_server_http-1.4.1-py3-none-any.whl (41 kB)
Downloading flask-3.1.3-py3-none-any.whl (103 kB)
Downloading flask_cors-6.0.5-py3-none-any.whl (16 kB)
Downloading inference_schema-1.8-py3-none-any.whl (21 kB)
Downloading opencensus_ext_azure-1.1.15-py2.py3-none-any.whl (43 kB)
Downloading azure_core-1.41.0-py3-none-any.whl (220 kB)
Downloading azure_identity-1.25.3-py3-none-any.whl (192 kB)
Downloading opencensus-0.11.4-py2.py3-none-any.whl (128 kB)
Downloading google_api_core-2.38.0-py3-none-any.whl (187 kB)
Downloading google_auth-2.58.0-py3-none-any.whl (262 kB)
Downloading googleapis_common_protos-1.75.3-py3-none-any.whl (306 kB)
Downloading opentelemetry_api-1.44.0-py3-none-any.whl (60 kB)
Downloading proto_plus-1.28.4-py3-none-any.whl (50 kB)
Downloading protobuf-7.36.2-cp310-abi3-manylinux2014_aarch64.whl (344 kB)
Downloading pydantic-2.11.10-py3-none-any.whl (444 kB)
Downloading pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.9 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.9/1.9 MB 6.7 MB/s eta 0:00:00
Downloading requests-2.34.2-py3-none-any.whl (73 kB)
Downloading charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (238 kB)
Downloading idna-3.20-py3-none-any.whl (69 kB)
Downloading six-1.17.0-py2.py3-none-any.whl (11 kB)
Downloading urllib3-2.8.0-py3-none-any.whl (135 kB)
Downloading wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (86 kB)
Downloading annotated_types-0.8.0-py3-none-any.whl (13 kB)
Downloading blinker-1.9.0-py3-none-any.whl (8.5 kB)
Downloading certifi-2026.7.22-py3-none-any.whl (136 kB)
Downloading click-8.5.0-py3-none-any.whl (125 kB)
Downloading cryptography-50.0.1-cp311-abi3-manylinux_2_34_aarch64.whl (4.7 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.7/4.7 MB 7.0 MB/s eta 0:00:00
Downloading cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (222 kB)
Downloading gunicorn-26.2.0-py3-none-any.whl (228 kB)
Downloading itsdangerous-2.2.0-py3-none-any.whl (16 kB)
Downloading jinja2-3.1.6-py3-none-any.whl (134 kB)
Downloading markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (24 kB)
Downloading msal-1.39.0-py3-none-any.whl (131 kB)
Downloading pyjwt-2.14.0-py3-none-any.whl (32 kB)
Downloading msal_extensions-1.3.1-py3-none-any.whl (20 kB)
Downloading opencensus_context-0.1.3-py2.py3-none-any.whl (5.1 kB)
Downloading psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (156 kB)
Downloading pyasn1_modules-0.4.2-py3-none-any.whl (181 kB)
Downloading pyasn1-0.6.4-py3-none-any.whl (84 kB)
Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
Downloading pytz-2026.3.post1-py2.py3-none-any.whl (508 kB)
Downloading typing_extensions-4.16.0-py3-none-any.whl (45 kB)
Downloading typing_inspection-0.4.4-py3-none-any.whl (14 kB)
Downloading werkzeug-3.1.8-py3-none-any.whl (226 kB)
Downloading pycparser-3.0-py3-none-any.whl (48 kB)
Downloading pydantic_settings-2.15.0-py3-none-any.whl (69 kB)
Downloading python_dotenv-1.2.3-py3-none-any.whl (22 kB)
Installing collected packages: pytz, opencensus-context, wrapt, urllib3, typing-extensions, six, python-dotenv, PyJWT, pycparser, pyasn1, psutil, protobuf, markupsafe, itsdangerous, idna, gunicorn, click, charset_normalizer, certifi, blinker, annotated-types, werkzeug, typing-inspection, requests, python-dateutil, pydantic-core, pyasn1-modules, proto-plus, opentelemetry-api, jinja2, googleapis-common-protos, cffi, pydantic, inference-schema, flask, cryptography, azure-core, pydantic-settings, google-auth, flask-cors, msal, google-api-core, opencensus, msal-extensions, azure-identity, opencensus-ext-azure, azureml-inference-server-http

Successfully installed PyJWT-2.14.0 annotated-types-0.8.0 azure-core-1.41.0 azure-identity-1.25.3 azureml-inference-server-http-1.4.1 blinker-1.9.0 certifi-2026.7.22 cffi-2.1.1 charset_normalizer-3.5.1 click-8.5.0 cryptography-50.0.1 flask-3.1.3 flask-cors-6.0.5 google-api-core-2.38.0 google-auth-2.58.0 googleapis-common-protos-1.75.3 gunicorn-26.2.0 idna-3.20 inference-schema-1.8 itsdangerous-2.2.0 jinja2-3.1.6 markupsafe-3.0.3 msal-1.39.0 msal-extensions-1.3.1 opencensus-0.11.4 opencensus-context-0.1.3 opencensus-ext-azure-1.1.15 opentelemetry-api-1.44.0 proto-plus-1.28.4 protobuf-7.36.2 psutil-7.2.2 pyasn1-0.6.4 pyasn1-modules-0.4.2 pycparser-3.0 pydantic-2.11.10 pydantic-core-2.33.2 pydantic-settings-2.15.0 python-dateutil-2.9.0.post0 python-dotenv-1.2.3 pytz-2026.3.post1 requests-2.34.2 six-1.17.0 typing-extensions-4.16.0 typing-inspection-0.4.4 urllib3-2.8.0 werkzeug-3.1.8 wrapt-1.16.0

done
WARNING conda.conda_pypi.main:notify_externally_managed_future(156):
  Did you know? You can install many PyPI packages with conda
  using the conda-pypi beta. Get started:
    https://docs.conda.io/projects/conda/en/stable/new-features.html

#
# To activate this environment, use
#
#     $ conda activate inf-conda-env
#
# To deactivate an active environment, use
#
#     $ conda deactivate

... ---> 0b6b3b7ae1c8
Step 6/7 : RUN conda run -n inf-conda-env pip install debugpy
. ---> Running in 519c3f14c9ac
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
Collecting debugpy
  Downloading debugpy-1.8.22-py2.py3-none-any.whl.metadata (1.4 kB)
Downloading debugpy-1.8.22-py2.py3-none-any.whl (5.4 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.4/5.4 MB 6.8 MB/s eta 0:00:00
Installing collected packages: debugpy
Successfully installed debugpy-1.8.22
 ---> d923516c474e
Step 7/7 : CMD ["conda", "run", "--no-capture-output", "-n", "inf-conda-env", "runsvdir", "/var/runit"]
 ---> Running in 065351b1270b
. ---> 6ab24551e0cf
Successfully built 6ab24551e0cf
Successfully tagged my-endpoint:blue

Starting up endpointurllib3.connectionpool: http://localhost:None "GET /v1.56/containers/json?limit=-1&all=1&size=0&trunc_cmd=0&filters=%7B%22label%22%3A+%5B%22azureml-local-endpoint%22%2C+%22endpoint%3Dmy-endpoint%22%5D%7D HTTP/1.1" 200 None
urllib3.connectionpool: http://localhost:None "POST /v1.56/containers/create?name=my-endpoint.blue HTTP/1.1" 201 None
urllib3.connectionpool: http://localhost:None "GET /v1.56/containers/b0279b75180d658e4685370cf52b482530ede13ec7d2729ead9f89457471511f/json HTTP/1.1" 200 None
urllib3.connectionpool: http://localhost:None "DELETE /v1.56/containers/b0279b75180d658e4685370cf52b482530ede13ec7d2729ead9f89457471511f?v=False&link=False&force=False HTTP/1.1" 204 0
...Done (1m 45s)
urllib3.connectionpool: http://localhost:None "GET /v1.56/containers/json?limit=-1&all=1&size=0&trunc_cmd=0&filters=%7B%22label%22%3A+%5B%22azureml-local-endpoint%22%2C+%22endpoint%3Dmy-endpoint%22%2C+%22deployment%3Dblue%22%5D%7D HTTP/1.1" 200 None
urllib3.connectionpool: http://localhost:None "GET /v1.56/containers/5a604248c951d386692e3f8c249568c22920818f39e0f4794c84356a42c0fdda/json HTTP/1.1" 200 None
cli.knack.cli: Event: CommandInvoker.OnTransformResult [<function _resource_group_transform at 0x108135c70>, <function _x509_from_base64_to_hex_transform at 0x108135d20>]
cli.knack.cli: Event: CommandInvoker.OnFilterResult []
{
  "app_insights_enabled": false,
  "code_configuration": {
    "code": "../../model-1/onlinescoring/",
    "scoring_script": "score.py"
  },
  "endpoint_name": "my-endpoint",
  "environment": {
    "conda_file": {
      "channels": [
        "conda-forge"
      ],
      "dependencies": [
        "python=3.12",
        "numpy=2.3.1",
        "pip=25.1.1",
        "scikit-learn=1.7.0",
        "scipy=1.16.0",
        {
          "pip": [
            "azureml-inference-server-http==1.4.1",
            "inference-schema[numpy-support]",
            "joblib"
          ]
        }
      ],
      "name": "model-env"
    },
    "image": "condaforge/miniforge3:latest",
    "name": "CliV2AnonymousEnvironment",
    "tags": {},
    "version": "f3b0552770cd4b62b78bb37ef52f1b6cb6822530701eeb0aa570b84492b7cefa"
  },
  "environment_variables": {},
  "instance_count": 1,
  "instance_type": "local",
  "model": {
    "name": "a035e64faf8a14fb3d2a54ce6a8dda131f18ac41b36d46f9fb41bcfd1bea2043",
    "path": "/Users/<user>/Projects/azureml-examples/cli/endpoints/online/model-1/model",
    "properties": {},
    "tags": {},
    "type": "custom_model",
    "version": "1"
  },
  "name": "blue",
  "properties": {},
  "provisioning_state": "Succeeded",
  "tags": {},
  "type": "managed"
}
cli.knack.cli: Event: Cli.SuccessfulExecute []
cli.knack.cli: Event: Cli.PostExecute [<function AzCliLogging.deinit_cmd_metadata_logging at 0x10808d2d0>]
az_command_data_logger: exit code: 0
cli.__main__: Command ran in 109.306 seconds (init: 0.064, invoke: 109.242)
telemetry.main: Begin splitting cli events and extra events, total events: 1
telemetry.main: Finish splitting cli events and extra events, cli events: 1
telemetry.save: Save telemetry record of length 4742 in cache file under /Users/<user>/.azure/telemetry/20260923114445922
telemetry.main: Begin creating telemetry upload process.
telemetry.process: Creating upload process: "/opt/homebrew/Cellar/azure-cli/2.90.0/libexec/bin/python /opt/homebrew/Cellar/azure-cli/2.90.0/libexec/lib/python3.14/site-packages/azure/cli/telemetry/__init__.py /Users/<user>/.azure /Users/<user>/.azure/telemetry/20260923114445922"
telemetry.process: Return from creating process 98713
telemetry.main: Finish creating telemetry upload process.

Expected behavior

I expect to be able to follow https://learn.microsoft.com/en-us/azure/machine-learning/how-to-debug-managed-online-endpoints-visual-studio-code?view=azureml-api-2&tabs=cli and get an arm64-based local debugging environment.

Environment Summary

az --version
azure-cli                         2.90.0

core                              2.90.0
telemetry                          1.1.0

Extensions:
ml                                2.45.0

Dependencies:
msal                              1.36.0
azure-mgmt-resource               24.0.0

Additional context

No response

Activity

  1. added
    bugThis issue requires a change to an existing behavior in the product in order to be resolved.
    on Sep 23, 2026
  2. yonzhan commented on Sep 23, 2026

    @yonzhan
    Collaborator

    Thank you for opening this issue, we will look into it.

  3. x-engineering-agent commented on Sep 23, 2026

    @x-engineering-agent

    Bug Analysis

    Assessment: Sufficient to investigate a local-debugging compatibility bug. The leading source-backed hypothesis is a conda-prefix mismatch, not a demonstrated CLI architecture-selection bug. The reported debugger failure has not been independently reproduced.

    Affected extension: ml 2.45.0, maintained under src/machinelearningservices/ (azext_mlv2). Keep this work on #10386; no tracker issue is needed. Target branch: main.

    Reported reproduction and behavior

    az ml online-deployment create --file endpoints/online/managed/sample/blue-deployment.yml --local --vscode-debug
    

    The author also supplied this command with --debug. Context: Azure CLI/core 2.90.0, ml 2.45.0, Apple M5 Pro/ARM64. The standard sample image produces an AMD64 local environment with unusable LLM performance. Replacing the image with condaforge/miniforge3:latest produces the desired ARM64 environment, but VS Code cannot attach the debugger. Expected: native ARM64 local execution with working VS Code debugging.

    The supplied VS Code output starts the debug adapter with /opt/conda/bin/python and reports the active scoring interpreter as /opt/conda/envs/inf-conda-env/bin/python. It contains a Mamba-manager warning but no attach exception. No author follow-up adds further diagnostic evidence. The image digest and exact attach failure remain unconfirmed; do not treat an informational adapter-start log or the Mamba warning as a proven root cause.

    Current source evidence

    • Extension metadata confirms version 2.45.0; requirements pins azure-ai-ml==1.35.0.
    • ml_online_deployment_create forwards local, local_enable_gpu, and vscode_debug into MLClient.begin_create_or_update. The examined CLI wrapper does not force AMD64 or implement debugger attachment.
    • In the pinned SDK, LocalEndpointConstants hardcodes the inference executable directory and Python path under /opt/miniconda/envs/inf-conda-env, unlike the author's /opt/conda layout.
    • AzureMlImageContext assigns that hardcoded directory to AZUREML_INFERENCE_PYTHON_PATH. Separately, Settings.to_dict assigns the hardcoded executable to python.defaultInterpreterPath and creates the Azure ML local-inference attach configuration. Selecting a different VS Code interpreter alone does not change the container environment variable.
    • DockerfileResolver._construct keeps the selected base image and installs debugpy into the named conda environment. VSCodeClient passes the environment through to the devcontainer configuration. Thus successful ARM64 image creation does not establish that the inference/debug launch uses a valid interpreter.

    Implementation handoff and acceptance criteria

    1. Confirm whether the inference/debug launch actually consumes the invalid /opt/miniconda path with an /opt/conda image before choosing a fix. Inspect the generated devcontainer configuration, inference environment and Azure ML debug-launch integration; do not assume ARM64 itself or debugpy is broken.
    2. Resolve both inference and debugger interpreter paths from the selected image's actual conda environment, through the authoritative owning source. Do not globally replace one hardcoded prefix with another, infer a container path from host architecture, force AMD64 emulation, or silently change the user's base image. Preserve the existing /opt/miniconda layout and non-debug/managed-deployment behavior.
    3. Source ownership is a gate: the concrete path construction above belongs to the azure-ai-ml SDK, not an AAZ command model. The extension files inspected also carry AutoRest-generated headers, including files below manual/. Locate and change their durable source/generation inputs and use the owning generation/release workflow; never patch generated output, installed packages, or vendor SDK internals. If the necessary SDK/source change is outside the durable job's approved scope, report that precise upstream prerequisite/blocker instead of manufacturing a same-repository fix. Do not create another issue or dispatch another backend.
    4. Add focused regression coverage in the owning source for /opt/conda and /opt/miniconda layouts, consistent inference/debugger paths, unchanged image selection, and unchanged forwarding of local/debug flags. Preserve the Azure ML attach protocol. Use the repository's existing validation only in the authorized implementation environment; no infrastructure provisioning is requested by this triage.
    5. For a downstream extension release, consume the verified source fix through its normal dependency/generation process and maintain version/history/compatibility metadata. Do not manually edit src/index.json. Do not claim working ARM64 debugger attachment without evidence.

    This is a source-inspection handoff, not a claim of a completed fix or executed tests. The implementation backend is the durable Foundry job only.

    Mandatory Codegen execution protocol

    Before editing implementation files, determine whether the affected machinelearningservices command is AAZ-generated. Files under aaz/<profile>/ are generated output and must never be patched directly, including by an AI agent. Check out Azure/aaz beside Azure/azure-rest-api-specs, Azure/aaz-dev-tools, and the downstream repository. API-schema defects start in the specification; command naming, grouping, arguments, API-version selection, help, and examples belong in the durable Azure/aaz command model; non-modelable client behavior belongs in a handwritten subclass or wrapper in custom.py, registered from commands.py. X Engineering Agent creates and promotes the corresponding durable Azure/aaz source pull request before it promotes downstream generated output.

    Follow the Azure CLI repository's Codegen workflow and the aaz-dev setup documentation. Set up the checked-out repositories with azdev setup. Use generate only when importing or redesigning command models from Swagger/TypeSpec. For an existing module whose durable Azure/aaz model has been updated, render that model with regenerate:

    aaz-dev cli regenerate --name machinelearningservices --cli-extension-path <azure-cli-extensions>
    
    # New/imported command model only:
    aaz-dev cli generate --spec <specification-name> --module machinelearningservices

    You MUST actually run the generator; do not merely describe it or imitate its output. If the AAZ/specification checkout, local source change, credentials, or generator is unavailable, stop and report the blocker instead of editing generated files. Inspect _aaz_info provenance and the complete regenerated diff, then run focused azdev style, azdev linter, and azdev test validation. For an extension, also update its version and HISTORY.rst, preserve azext_metadata.json compatibility, and let release automation update src/index.json.

    PR title & description format (required)

    This repo enforces a PR format (guide). Please author the PR exactly as follows or CI's Check the Format of Pull Request Title and Content will fail.

    Use this EXACT PR title (copy verbatim, do not reword):

    [Machinelearningservices] Fix #10386: `az ml online-deployment create`: Resolve local debugging conda paths for ARM64 images
    

    Keep the backticks around the command and the Fix #10386: prefix. You may only adjust the wording after the command (the final summary) if the fix changes; the [Machinelearningservices] prefix, issue link, and backticked command must stay.

    Description — follow the PR template and fill in:

    • Link the issue — start the Description with a closing keyword so the PR auto-links and closes it: Fixes #10386.
    • Related command — the az ... command this affects.
    • Description (mandatory) — why the bug happens, what you changed, and the resulting behavior.
    • Testing Guide — example command(s) showing the fix works.
    • History Notes — leave the title to drive the history note, or add extra lines in the same format (component in brackets + the command in backticks), e.g. [Machinelearningservices] `az <command>`: <note>.
    • Keep the template checklist and tick the items you've satisfied.
  4. removed
    questionThe issue doesn't require a change to the product in order to be resolved. Most issues start as that
    on Sep 23, 2026
  5. LukaFiederer commented on Sep 24, 2026

    @LukaFiederer
    Author

    Bug Analysis

    Assessment: Sufficient to investigate a local-debugging compatibility bug. The leading source-backed hypothesis is a conda-prefix mismatch, not a demonstrated CLI architecture-selection bug. The reported debugger failure has not been independently reproduced.

    Affected extension: ml 2.45.0, maintained under src/machinelearningservices/ (azext_mlv2). Keep this work on #10386; no tracker issue is needed. Target branch: main.

    Reported reproduction and behavior

    az ml online-deployment create --file endpoints/online/managed/sample/blue-deployment.yml --local --vscode-debug
    

    The author also supplied this command with --debug. Context: Azure CLI/core 2.90.0, ml 2.45.0, Apple M5 Pro/ARM64. The standard sample image produces an AMD64 local environment with unusable LLM performance. Replacing the image with condaforge/miniforge3:latest produces the desired ARM64 environment, but VS Code cannot attach the debugger. Expected: native ARM64 local execution with working VS Code debugging.

    The supplied VS Code output starts the debug adapter with /opt/conda/bin/python and reports the active scoring interpreter as /opt/conda/envs/inf-conda-env/bin/python. It contains a Mamba-manager warning but no attach exception. No author follow-up adds further diagnostic evidence. The image digest and exact attach failure remain unconfirmed; do not treat an informational adapter-start log or the Mamba warning as a proven root cause.

    Current source evidence

    * [Extension metadata](https://github.com/Azure/azure-cli-extensions/blob/b601ece641dcd01698bab48ec690956f0fd4f060/src/machinelearningservices/setup.py#L12-L14) confirms version 2.45.0; [requirements](https://github.com/Azure/azure-cli-extensions/blob/b601ece641dcd01698bab48ec690956f0fd4f060/src/machinelearningservices/azext_mlv2/manual/requirements.txt) pins `azure-ai-ml==1.35.0`.
    
    * [`ml_online_deployment_create`](https://github.com/Azure/azure-cli-extensions/blob/b601ece641dcd01698bab48ec690956f0fd4f060/src/machinelearningservices/azext_mlv2/manual/custom/online_deployment.py#L133-L140) forwards `local`, `local_enable_gpu`, and `vscode_debug` into `MLClient.begin_create_or_update`. The examined CLI wrapper does not force AMD64 or implement debugger attachment.
    
    * In the pinned SDK, [`LocalEndpointConstants`](https://github.com/Azure/azure-sdk-for-python/blob/59fb7a9d52b4c85ac5076d31759f5c3a501072e4/sdk/ml/azure-ai-ml/azure/ai/ml/constants/_endpoint.py#L73-L80) hardcodes the inference executable directory and Python path under `/opt/miniconda/envs/inf-conda-env`, unlike the author's `/opt/conda` layout.
    
    * [`AzureMlImageContext`](https://github.com/Azure/azure-sdk-for-python/blob/59fb7a9d52b4c85ac5076d31759f5c3a501072e4/sdk/ml/azure-ai-ml/azure/ai/ml/_local_endpoints/azureml_image_context.py#L68-L72) assigns that hardcoded directory to `AZUREML_INFERENCE_PYTHON_PATH`. Separately, [`Settings.to_dict`](https://github.com/Azure/azure-sdk-for-python/blob/59fb7a9d52b4c85ac5076d31759f5c3a501072e4/sdk/ml/azure-ai-ml/azure/ai/ml/_local_endpoints/vscode_debug/devcontainer_properties.py#L173-L196) assigns the hardcoded executable to `python.defaultInterpreterPath` and creates the Azure ML local-inference attach configuration. Selecting a different VS Code interpreter alone does not change the container environment variable.
    
    * [`DockerfileResolver._construct`](https://github.com/Azure/azure-sdk-for-python/blob/59fb7a9d52b4c85ac5076d31759f5c3a501072e4/sdk/ml/azure-ai-ml/azure/ai/ml/_local_endpoints/dockerfile_resolver.py#L88-L120) keeps the selected base image and installs debugpy into the named conda environment. [`VSCodeClient`](https://github.com/Azure/azure-sdk-for-python/blob/59fb7a9d52b4c85ac5076d31759f5c3a501072e4/sdk/ml/azure-ai-ml/azure/ai/ml/_local_endpoints/vscode_debug/vscode_client.py#L14-L32) passes the environment through to the devcontainer configuration. Thus successful ARM64 image creation does not establish that the inference/debug launch uses a valid interpreter.
    

    Implementation handoff and acceptance criteria

    1. Confirm whether the inference/debug launch actually consumes the invalid `/opt/miniconda` path with an `/opt/conda` image before choosing a fix. Inspect the generated devcontainer configuration, inference environment and Azure ML debug-launch integration; do not assume ARM64 itself or debugpy is broken.
    
    2. Resolve both inference and debugger interpreter paths from the selected image's actual conda environment, through the authoritative owning source. Do not globally replace one hardcoded prefix with another, infer a container path from host architecture, force AMD64 emulation, or silently change the user's base image. Preserve the existing `/opt/miniconda` layout and non-debug/managed-deployment behavior.
    
    3. **Source ownership is a gate:** the concrete path construction above belongs to the `azure-ai-ml` SDK, not an AAZ command model. The extension files inspected also carry AutoRest-generated headers, including files below `manual/`. Locate and change their durable source/generation inputs and use the owning generation/release workflow; never patch generated output, installed packages, or vendor SDK internals. If the necessary SDK/source change is outside the durable job's approved scope, report that precise upstream prerequisite/blocker instead of manufacturing a same-repository fix. Do not create another issue or dispatch another backend.
    
    4. Add focused regression coverage in the owning source for `/opt/conda` and `/opt/miniconda` layouts, consistent inference/debugger paths, unchanged image selection, and unchanged forwarding of local/debug flags. Preserve the Azure ML attach protocol. Use the repository's existing validation only in the authorized implementation environment; no infrastructure provisioning is requested by this triage.
    
    5. For a downstream extension release, consume the verified source fix through its normal dependency/generation process and maintain version/history/compatibility metadata. Do not manually edit `src/index.json`. Do not claim working ARM64 debugger attachment without evidence.
    

    This is a source-inspection handoff, not a claim of a completed fix or executed tests. The implementation backend is the durable Foundry job only.

    Mandatory Codegen execution protocol

    Before editing implementation files, determine whether the affected machinelearningservices command is AAZ-generated. Files under aaz/<profile>/ are generated output and must never be patched directly, including by an AI agent. Check out Azure/aaz beside Azure/azure-rest-api-specs, Azure/aaz-dev-tools, and the downstream repository. API-schema defects start in the specification; command naming, grouping, arguments, API-version selection, help, and examples belong in the durable Azure/aaz command model; non-modelable client behavior belongs in a handwritten subclass or wrapper in custom.py, registered from commands.py. X Engineering Agent creates and promotes the corresponding durable Azure/aaz source pull request before it promotes downstream generated output.

    Follow the Azure CLI repository's Codegen workflow and the aaz-dev setup documentation. Set up the checked-out repositories with azdev setup. Use generate only when importing or redesigning command models from Swagger/TypeSpec. For an existing module whose durable Azure/aaz model has been updated, render that model with regenerate:

    aaz-dev cli regenerate --name machinelearningservices --cli-extension-path

    New/imported command model only:

    aaz-dev cli generate --spec --module machinelearningservices

    You MUST actually run the generator; do not merely describe it or imitate its output. If the AAZ/specification checkout, local source change, credentials, or generator is unavailable, stop and report the blocker instead of editing generated files. Inspect _aaz_info provenance and the complete regenerated diff, then run focused azdev style, azdev linter, and azdev test validation. For an extension, also update its version and HISTORY.rst, preserve azext_metadata.json compatibility, and let release automation update src/index.json.

    PR title & description format (required)

    This repo enforces a PR format (guide). Please author the PR exactly as follows or CI's Check the Format of Pull Request Title and Content will fail.

    Use this EXACT PR title (copy verbatim, do not reword):

    [Machinelearningservices] Fix #10386: `az ml online-deployment create`: Resolve local debugging conda paths for ARM64 images
    

    Keep the backticks around the command and the Fix #10386: prefix. You may only adjust the wording after the command (the final summary) if the fix changes; the [Machinelearningservices] prefix, issue link, and backticked command must stay.

    Description — follow the PR template and fill in:

    * **Link the issue** — start the Description with a closing keyword so the PR auto-links and closes it: `Fixes #10386`.
    
    * **Related command** — the `az ...` command this affects.
    
    * **Description** _(mandatory)_ — why the bug happens, what you changed, and the resulting behavior.
    
    * **Testing Guide** — example command(s) showing the fix works.
    
    * **History Notes** — leave the title to drive the history note, or add extra lines in the same format (component in brackets + the command in backticks), e.g. `` [Machinelearningservices] `az <command>`: <note> ``.
    
    * Keep the template checklist and tick the items you've satisfied.
    

    Providing arm64-compatible base images for the ML service could be the most straight forward solution. This would avoid having to force users to use other image sources.

  6. microsoft-github-policy-service commented on Oct 2, 2026

    @microsoft-github-policy-service
    Contributor

    Thanks for the feedback! We are routing this to the appropriate team for follow-up. cc azureml-github, @Azure/act-experience-enablement-squad.

  7. x-engineering-agent commented on Oct 2, 2026

    @x-engineering-agent

    Ownership follow-up

    Official ARM64 Azure ML base images would address the image-availability concern without requiring users to choose another image provider. That request needs the Azure ML image-publishing owners; it is separate from the local debugger compatibility issue.

    The extension is now ml 2.45.1, and its current dependency pin is azure-ai-ml==1.35.1. That SDK still hardcodes the inference environment under /opt/miniconda, and its VS Code configuration selects that interpreter. This keeps the alternate-Conda-prefix hypothesis relevant, but does not establish the cause of the reported attach failure.

    The implementation prerequisite belongs to the azure-ai-ml SDK in Azure/azure-sdk-for-python; official image availability belongs to the Azure ML image owners. I am not requeuing an extensions-only implementation or replacing the selected image, because neither would resolve those ownership prerequisites. A downstream extension update should consume a verified SDK fix through the normal release process, preserving existing Miniconda behavior and user-selected images.

    Maintainers: please coordinate the SDK compatibility investigation and the official ARM64-image request with those owners. This issue remains open; the current Agent analysis request is complete. Automation can be requested again when an actionable extension change or an upstream release is available.

    Posted by x-engineering-agent (Fixer)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Auto-AssignAuto assign by botMachine LearningService AttentionThis issue is responsible by Azure service team.act-experience-enablement-squadbugThis issue requires a change to an existing behavior in the product in order to be resolved.customer-reportedIssues that are reported by GitHub users external to the Azure organization.extension/ml

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions