Martin
Martin

Reputation: 39

OpenAI fine-tune with python return null model

I am trying to get fine-tune model from OpenAI GPT-3 using python with following code

#upload training data

upload_response = openai.File.create(
  file=open(file_name, "rb"),
  purpose='fine-tune'
)
file_id = upload_response.id
print(f'\nupload training data respond:\n\n {upload_response}')

OpenAI respond with data

 {
  "bytes": 380,
  "created_at": 1675789714,
  "filename": "file",
  "id": "file-lKSQushd8eABcfiBVwhxBMOJ",
  "object": "file",
  "purpose": "fine-tune",
  "status": "uploaded",
  "status_details": null
}

My training file has been uploaded so I am checking for fine-tune response with code

fine_tune_response = openai.FineTune.create(training_file=file_id)
print(f'\nfine-tune respond:\n\n {fine_tune_response}')

I am getting

 {
  "created_at": 1675789714,
  "events": [
    {
      "created_at": 1675789715,
      "level": "info",
      "message": "Created fine-tune: ft-IqBdk4WJETm4KakIzfZeCHgS",
      "object": "fine-tune-event"
    }
  ],
  "fine_tuned_model": null,
  "hyperparams": {
    "batch_size": null,
    "learning_rate_multiplier": null,
    "n_epochs": 4,
    "prompt_loss_weight": 0.01
  },
  "id": "ft-IqBdk4WJETm4KakIzfZeCHgS",
  "model": "curie",
  "object": "fine-tune",
  "organization_id": "org-R6DqvjTNimKtBzWWgae6VmAy",
  "result_files": [],
  "status": "pending",
  "training_files": [
    {
      "bytes": 380,
      "created_at": 1675789714,
      "filename": "file",
      "id": "file-lKSQushd8eABcfiBVwhxBMOJ",
      "object": "file",
      "purpose": "fine-tune",
      "status": "uploaded",
      "status_details": null
    }
  ],
  "updated_at": 1675789714,
  "validation_files": []
}

As you see, the fine_tune_model is null so I cant use it for Completion. My question is how to check for example in While loop if my fine-tune is complete using ft id

Upvotes: 1

Views: 1716

Answers (2)

Anton Andreev
Anton Andreev

Reputation: 2132

Here is a code to wait until your model is trained with updates:

print("Started Training ...")
id = fine_tune_response.id
error = False
while True:
    cmd = "openai -k " + api_key + " api fine_tunes.get -i " + id
    result = subprocess.run(cmd, stdout=subprocess.PIPE, shell=True)
    if "\"status\": \"succeeded\"" in str(result.stdout):
        print("Succeeded")
        break
    if result.stderr !=None:
        print("Error in cmd!")
        error = True
        break
    if "\"status\": \"failed\"" in str(result.stdout):
        print("Failed remote job!")
        error = True
        break
    time.sleep(20)
    print("Still training ...")
print("Done Training")

Full example: https://github.com/toncho11/ML_examples/blob/main/OpenAI/FineTuneGPT3.py Note that if the CMD returns the help screen of openai command then this loop will never exit.

Upvotes: 0

Kane Hooper
Kane Hooper

Reputation: 1909

Here is data from the OpenAI documentation on fine-tuning:

After you've started a fine-tune job, it may take some time to complete. Your job may be queued behind other jobs on our system, and training our model can take minutes or hours depending on the model and dataset size.

Ref: https://platform.openai.com/docs/guides/fine-tuning

The OpenAI guide uses the CLI tool to create the fine-tuning and then accesses the model programatically once the training has completed.

Therefore, you couldn't run the code in Python as you have laid it out, since you need to wait for the training to complete. Meaning you can't train the model on the fly and use it instantly.

Upvotes: 2

Related Questions