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
Original file line number Diff line number Diff line change
Expand Up @@ -56,78 +56,35 @@
resource_group = os.environ["AZURE_AI_PROJECTS_AZURE_RESOURCE_GROUP"]
account_name = os.environ["AZURE_AI_PROJECTS_AZURE_AOAI_ACCOUNT"]

with (
DefaultAzureCredential() as credential,
AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
project_client.get_openai_client() as openai_client,
):
# [START finetuning_supervised_job_sample]
print("Uploading training file...")
with open(training_file_path, "rb") as f:
train_file = openai_client.files.create(file=f, purpose="fine-tune")
print(f"Uploaded training file with ID: {train_file.id}")

print("Uploading validation file...")
with open(validation_file_path, "rb") as f:
validation_file = openai_client.files.create(file=f, purpose="fine-tune")
print(f"Uploaded validation file with ID: {validation_file.id}")

print("Waits for the training and validation files to be processed...")
openai_client.files.wait_for_processing(train_file.id)
openai_client.files.wait_for_processing(validation_file.id)

print("Creating supervised fine-tuning job")
fine_tuning_job = openai_client.fine_tuning.jobs.create(
training_file=train_file.id,
validation_file=validation_file.id,
model=model_name,
method={
"type": "supervised",
"supervised": {"hyperparameters": {"n_epochs": 3, "batch_size": 1, "learning_rate_multiplier": 1.0}},
},
extra_body={
"trainingType": "Standard"
}, # Recommended approach to set trainingType. Omitting this field may lead to unsupported behavior.
)
print(fine_tuning_job)

print(f"Getting fine-tuning job with ID: {fine_tuning_job.id}")
retrieved_job = openai_client.fine_tuning.jobs.retrieve(fine_tuning_job.id)
print(retrieved_job)
def pause_job(openai_client, job_id):
"""Pause a fine-tuning job.
print("Listing all fine-tuning jobs:")
for job in openai_client.fine_tuning.jobs.list():
print(job)
Job needs to be in running state in order to pause.
"""
print(f"Pausing fine-tuning job with ID: {job_id}")
paused_job = openai_client.fine_tuning.jobs.pause(job_id)
print(paused_job)

print("Listing only 10 fine-tuning jobs:")
for job in openai_client.fine_tuning.jobs.list(limit=10):
print(job)

print(f"Pausing fine-tuning job with ID: {fine_tuning_job.id}")
paused_job = openai_client.fine_tuning.jobs.pause(fine_tuning_job.id)
print(paused_job)
def resume_job(openai_client, job_id):
"""Resume a fine-tuning job.
print(f"Resuming fine-tuning job with ID: {fine_tuning_job.id}")
resumed_job = openai_client.fine_tuning.jobs.resume(fine_tuning_job.id)
Job needs to be in paused state in order to resume.
"""
print(f"Resuming fine-tuning job with ID: {job_id}")
resumed_job = openai_client.fine_tuning.jobs.resume(job_id)
print(resumed_job)

print(f"Listing events of fine-tuning job: {fine_tuning_job.id}")
for event in openai_client.fine_tuning.jobs.list_events(fine_tuning_job.id):
print(event)

# Note that to retrieve the checkpoints, job needs to be in terminal state.
print(f"Listing checkpoints of fine-tuning job: {fine_tuning_job.id}")
for checkpoint in openai_client.fine_tuning.jobs.checkpoints.list(fine_tuning_job.id):
print(checkpoint)

print(f"Cancelling fine-tuning job with ID: {fine_tuning_job.id}")
cancelled_job = openai_client.fine_tuning.jobs.cancel(fine_tuning_job.id)
print(f"Successfully cancelled fine-tuning job: {cancelled_job.id}, Status: {cancelled_job.status}")
def deploy_model(openai_client, credential, job_id):
"""Deploy the fine-tuned model.
# Deploy model (using Azure Management SDK - azure-mgmt-cognitiveservices)
# Note: Deployment can only be started after the fine-tuning job completes successfully.
print(f"Getting fine-tuning job with ID: {fine_tuning_job.id}")
fine_tuned_model_name = openai_client.fine_tuning.jobs.retrieve(fine_tuning_job.id).fine_tuned_model
Deploy model using Azure Management SDK (azure-mgmt-cognitiveservices).
Note: Deployment can only be started after the fine-tuning job completes successfully.
"""
print(f"Retrieving fine-tuning job with ID: {job_id}")
fine_tuned_model_name = openai_client.fine_tuning.jobs.retrieve(job_id).fine_tuned_model
deployment_name = "gpt-4-1-fine-tuned"

with CognitiveServicesManagementClient(credential=credential, subscription_id=subscription_id) as cogsvc_client:
Expand All @@ -140,6 +97,7 @@

deployment_config = Deployment(properties=deployment_properties, sku=deployment_sku)

print(f"Deploying fine-tuned model: {fine_tuned_model_name} with deployment name: {deployment_name}")
deployment = cogsvc_client.deployments.begin_create_or_update(
resource_group_name=resource_group,
account_name=account_name,
Expand All @@ -149,12 +107,114 @@

while deployment.status() not in ["Succeeded", "Failed"]:
time.sleep(30)
print(f"Status: {deployment.status()}")
print(f"Deployment status: {deployment.status()}")

print(f"Model deployment completed: {deployment_name}")
return deployment_name


def inference_model(openai_client, deployment_name):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
def inference_model(openai_client, deployment_name):
def infer(openai_client, deployment_name):

"""Perform inference on the deployed fine-tuned model."""
print(f"Testing fine-tuned model via deployment: {deployment_name}")

response = openai_client.responses.create(
model=deployment_name, input=[{"role": "user", "content": "Who invented the telephone?"}]
)
print(f"Model response: {response.output_text}")
# [END finetuning_supervised_job_sample]


def list_jobs(openai_client):
"""List fine-tuning jobs."""
print("Listing all fine-tuning jobs:")
for job in openai_client.fine_tuning.jobs.list():
print(job)


def list_events(openai_client, job_id):
"""List events of a fine-tuning job."""
print(f"Listing events of fine-tuning job: {job_id}")
for event in openai_client.fine_tuning.jobs.list_events(job_id):
print(event)


def list_checkpoints(openai_client, job_id):
"""List checkpoints of a fine-tuning job.
Note that to retrieve the checkpoints, job needs to be in terminal state.
"""
print(f"Listing checkpoints of fine-tuning job: {job_id}")
for checkpoint in openai_client.fine_tuning.jobs.checkpoints.list(job_id):
print(checkpoint)


def cancel_job(openai_client, job_id):
"""Cancel a fine-tuning job."""
print(f"Cancelling fine-tuning job with ID: {job_id}")
cancelled_job = openai_client.fine_tuning.jobs.cancel(job_id)
print(f"Successfully cancelled fine-tuning job: {cancelled_job.id}, Status: {cancelled_job.status}")


def retrieve_job(openai_client, job_id):
"""Retrieve a fine-tuning job."""
print(f"Getting fine-tuning job with ID: {job_id}")
retrieved_job = openai_client.fine_tuning.jobs.retrieve(job_id)
print(retrieved_job)


def main() -> None:
with (
DefaultAzureCredential() as credential,
AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
project_client.get_openai_client() as openai_client,
):
print("Uploading training file...")
with open(training_file_path, "rb") as f:
train_file = openai_client.files.create(file=f, purpose="fine-tune")
print(f"Uploaded training file with ID: {train_file.id}")

print("Uploading validation file...")
with open(validation_file_path, "rb") as f:
validation_file = openai_client.files.create(file=f, purpose="fine-tune")
print(f"Uploaded validation file with ID: {validation_file.id}")

print("Waits for the training and validation files to be processed...")
openai_client.files.wait_for_processing(train_file.id)
openai_client.files.wait_for_processing(validation_file.id)

print("Creating supervised fine-tuning job")
fine_tuning_job = openai_client.fine_tuning.jobs.create(
training_file=train_file.id,
validation_file=validation_file.id,
model=model_name,
method={
"type": "supervised",
"supervised": {"hyperparameters": {"n_epochs": 3, "batch_size": 1, "learning_rate_multiplier": 1.0}},
},
extra_body={
"trainingType": "Standard"
}, # Recommended approach to set trainingType. Omitting this field may lead to unsupported behavior.
)
print(fine_tuning_job)

# Uncomment any of the following methods to test specific functionalities:
# retrieve_job(openai_client, fine_tuning_job.id)

# list_jobs(openai_client)

# pause_job(openai_client, fine_tuning_job.id)

# resume_job(openai_client, fine_tuning_job.id)

# list_events(openai_client, fine_tuning_job.id)

# list_checkpoints(openai_client, fine_tuning_job.id)

# cancel_job(openai_client, fine_tuning_job.id)

# deployment_name = deploy_model(openai_client, credential, fine_tuning_job.id)

# inference_model(openai_client, deployment_name)


if __name__ == "__main__":
main()
Loading