From 23ea4a3aa985a71884ca8f7dae806594177aa1e5 Mon Sep 17 00:00:00 2001 From: Saanika Gupta Date: Fri, 27 Mar 2026 12:49:27 +0530 Subject: [PATCH 1/3] Fix UnboundLocalError in create_finetuning_job when validation_data is None (#45770) --- .../azure/ai/ml/finetuning/_create_job.py | 11 ++-- .../test_finetuning_job_convesion.py | 59 ++++++++++++++----- 2 files changed, 48 insertions(+), 22 deletions(-) diff --git a/sdk/ml/azure-ai-ml/azure/ai/ml/finetuning/_create_job.py b/sdk/ml/azure-ai-ml/azure/ai/ml/finetuning/_create_job.py index 53cffb5203f3..d1f2fb718ea5 100644 --- a/sdk/ml/azure-ai-ml/azure/ai/ml/finetuning/_create_job.py +++ b/sdk/ml/azure-ai-ml/azure/ai/ml/finetuning/_create_job.py @@ -2,15 +2,14 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # --------------------------------------------------------- -from typing import List, Optional, Dict +from typing import Dict, List, Optional + +from azure.ai.ml._utils._experimental import experimental from azure.ai.ml.constants._common import AssetTypes from azure.ai.ml.entities._inputs_outputs import Input, Output -from azure.ai.ml.entities._job.finetuning.custom_model_finetuning_job import ( - CustomModelFineTuningJob, -) +from azure.ai.ml.entities._job.finetuning.custom_model_finetuning_job import CustomModelFineTuningJob from azure.ai.ml.entities._job.job_resources import JobResources from azure.ai.ml.entities._job.queue_settings import QueueSettings -from azure.ai.ml._utils._experimental import experimental @experimental @@ -68,7 +67,7 @@ def create_finetuning_job( task=task, model=model_input, training_data=training_data_input, - validation_data=validation_data_input, # pylint: disable=(possibly-used-before-assignment + validation_data=validation_data_input if validation_data else None, hyperparameters=hyperparameters, compute=compute, resources=job_resources, diff --git a/sdk/ml/azure-ai-ml/tests/finetuning_job/unittests/test_finetuning_job_convesion.py b/sdk/ml/azure-ai-ml/tests/finetuning_job/unittests/test_finetuning_job_convesion.py index ef87f921437c..d97f718fc29b 100644 --- a/sdk/ml/azure-ai-ml/tests/finetuning_job/unittests/test_finetuning_job_convesion.py +++ b/sdk/ml/azure-ai-ml/tests/finetuning_job/unittests/test_finetuning_job_convesion.py @@ -1,21 +1,15 @@ +from typing import Dict, Optional + +import pytest + +from azure.ai.ml._restclient.v2024_10_01_preview.models import MLFlowModelJobInput, UriFileJobInput from azure.ai.ml.constants._common import AssetTypes -from azure.ai.ml.entities._inputs_outputs import Input, Output -from typing import Optional, Dict -from azure.ai.ml._restclient.v2024_10_01_preview.models import ( - UriFileJobInput, - MLFlowModelJobInput, -) from azure.ai.ml.constants._job.finetuning import FineTuningTaskTypes -from azure.ai.ml.entities._job.finetuning.custom_model_finetuning_job import ( - CustomModelFineTuningJob, -) -from azure.ai.ml.entities._job.finetuning.azure_openai_finetuning_job import ( - AzureOpenAIFineTuningJob, -) -from azure.ai.ml.entities._job.finetuning.azure_openai_hyperparameters import ( - AzureOpenAIHyperparameters, -) -import pytest +from azure.ai.ml.entities._inputs_outputs import Input, Output +from azure.ai.ml.entities._job.finetuning.azure_openai_finetuning_job import AzureOpenAIFineTuningJob +from azure.ai.ml.entities._job.finetuning.azure_openai_hyperparameters import AzureOpenAIHyperparameters +from azure.ai.ml.entities._job.finetuning.custom_model_finetuning_job import CustomModelFineTuningJob +from azure.ai.ml.finetuning import FineTuningTaskType, create_finetuning_job @pytest.mark.finetuning_test @@ -255,3 +249,36 @@ def _get_azure_openai_finetuning_job( **kwargs, ) return custom_model_finetuning_job + + +@pytest.mark.finetuning_test +@pytest.mark.unittest +class TestCreateFineTuningJobValidationDataNone: + def test_create_finetuning_job_without_validation_data(self): + """Test that create_finetuning_job works when validation_data is omitted (None).""" + job = create_finetuning_job( + task=FineTuningTaskType.TEXT_COMPLETION, + training_data="tests/test_configs/finetuning_job/test_datasets/text_completion/train.jsonl", + model="azureml://registries/azureml-meta/models/Meta-Llama-3-8B/versions/8", + output_model_name_prefix="llama-finetune-registered-1234", + hyperparameters={ + "per_device_train_batch_size": "1", + "learning_rate": "0.00002", + "num_train_epochs": "1", + }, + display_name="llama-3-8B-display-name", + name="llama-3-8B", + experiment_name="llama-3-8B-finetuning-experiment", + tags={"foo_tag": "bar"}, + properties={"my_property": "my_value"}, + ) + assert isinstance(job, CustomModelFineTuningJob) + assert job.validation_data is None + assert job.training_data is not None + assert job.training_data.type == AssetTypes.URI_FILE + assert job.model.type == AssetTypes.MLFLOW_MODEL + assert job.hyperparameters == { + "per_device_train_batch_size": "1", + "learning_rate": "0.00002", + "num_train_epochs": "1", + } From 9f8e3f9909d44ede4f3d6af6bf5e8405a9f62800 Mon Sep 17 00:00:00 2001 From: Saanika Gupta Date: Fri, 27 Mar 2026 13:11:12 +0530 Subject: [PATCH 2/3] Update CHANGELOG --- sdk/ml/azure-ai-ml/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/ml/azure-ai-ml/CHANGELOG.md b/sdk/ml/azure-ai-ml/CHANGELOG.md index c835f8ceb398..d9a0472a327c 100644 --- a/sdk/ml/azure-ai-ml/CHANGELOG.md +++ b/sdk/ml/azure-ai-ml/CHANGELOG.md @@ -8,6 +8,7 @@ - Fixed default deployment template check to verify `asset_id` is not None before logging template information. - Skip _list_secrets for identity-based datastores to prevent noisy telemetry traces. +- Fixed `UnboundLocalError` in `create_finetuning_job()` when `validation_data` is omitted or `None`. ### Other Changes From fda0777ff27a5c548eb69e54840110fe1433f8b0 Mon Sep 17 00:00:00 2001 From: Saanika Gupta Date: Fri, 27 Mar 2026 13:36:58 +0530 Subject: [PATCH 3/3] Address comment --- sdk/ml/azure-ai-ml/azure/ai/ml/finetuning/_create_job.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/ml/azure-ai-ml/azure/ai/ml/finetuning/_create_job.py b/sdk/ml/azure-ai-ml/azure/ai/ml/finetuning/_create_job.py index d1f2fb718ea5..0521e4ff37eb 100644 --- a/sdk/ml/azure-ai-ml/azure/ai/ml/finetuning/_create_job.py +++ b/sdk/ml/azure-ai-ml/azure/ai/ml/finetuning/_create_job.py @@ -49,6 +49,7 @@ def create_finetuning_job( path=training_data, ) + validation_data_input = None if validation_data: validation_data_input = Input( type=AssetTypes.URI_FILE, @@ -67,7 +68,7 @@ def create_finetuning_job( task=task, model=model_input, training_data=training_data_input, - validation_data=validation_data_input if validation_data else None, + validation_data=validation_data_input, hyperparameters=hyperparameters, compute=compute, resources=job_resources,