Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions sdk/ml/azure-ai-ml/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
12 changes: 6 additions & 6 deletions sdk/ml/azure-ai-ml/azure/ai/ml/finetuning/_create_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -50,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,
Expand All @@ -68,7 +68,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,
hyperparameters=hyperparameters,
compute=compute,
resources=job_resources,
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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",
}