import cv2 import numpy as np import IPython import os import openai import pandas as pd import json import subprocess from gensim.utils import set_gpt_model, clear_messages, format_finetune_prompt def format_completion(task_name, descriptions, code): completion_text = f" \n {task_name}: {descriptions}``` \n\n###" completion_text += "Implementation: \n ```python\n" + code + "``` \n END" return completion_text # test if using the finetuned model can generate better task coed than the base model # https://platform.openai.com/docs/guides/fine-tuning data_path = 'prompts/data' def load_offline_memory(): """get the current task descriptions, assets, and code""" base_task_path = os.path.join(data_path, "base_tasks.json") base_asset_path = os.path.join(data_path, "base_assets.json") base_task_code_path = os.path.join(data_path, "base_task_codes.json") base_tasks = json.load(open(base_task_path)) base_assets = json.load(open(base_asset_path)) base_task_codes = json.load(open(base_task_code_path)) generated_task_path = os.path.join(data_path, "generated_tasks.json") generated_asset_path = os.path.join(data_path, "generated_assets.json") generated_task_code_path = os.path.join(data_path, "generated_task_codes.json") # print("original base task num:", len(base_tasks)) base_tasks.update(json.load(open(generated_task_path))) # base_assets.update(json.load(open(generated_asset_path))) for task in json.load(open(generated_task_code_path)): if task not in base_task_codes: base_task_codes.append(task) # print("current base task num:", len(base_tasks)) return base_tasks, base_assets, base_task_codes code_buffer = {} base_tasks, base_assets, base_task_codes = load_offline_memory() TOTAL_DATASET_TOKENS = 0 added_tasks = [] df = pd.DataFrame() for task_file in base_task_codes: ## TODO(lirui): consider adding more structure here. task_name = task_file[:-3].replace("_", "-") if task_name in added_tasks: continue if task_name not in base_tasks: print(f"{task_name} missing") continue added_tasks.append(task_name) task_description = base_tasks[task_name] if os.path.exists("cliport/tasks/" + task_file): task_code = open("cliport/tasks/" + task_file).read() # the generated cliport task path elif os.path.exists("cliport/generated_tasks/" + task_file): task_code = open("cliport/generated_tasks/" + task_file).read() prompt = format_finetune_prompt(task_name) completion = format_completion(task_name, task_description, task_code) # rough estimates TOTAL_DATASET_TOKENS += len(prompt) / 4 TOTAL_DATASET_TOKENS += len(completion) / 4 new_row = { 'prompt': prompt, 'completion': completion} new_row = pd.DataFrame([new_row]) df = pd.concat([df, new_row], axis=0, ignore_index=True) df.to_csv("prompts/finetune_data.csv",index=False) print("======================================") print("estimate number of tokens:", TOTAL_DATASET_TOKENS) print("estimate price for davinci:", TOTAL_DATASET_TOKENS / 1000 * 0.03) print("total number of instructions:", len(df)) print("======================================") # actual finetuning ## prepared_data.csv --> prepared_data_prepared.json subprocess.run('openai tools fine_tunes.prepare_data --file prompts/finetune_data.csv --quiet'.split()) print("now you can run \n openai api fine_tunes.create --training_file prompts/finetune_data_prepared.jsonl --model davinci --suffix 'GenSim'") # Model Training Usage # Ada $0.0004 / 1K tokens $0.0016 / 1K tokens # Curie $0.0030 / 1K tokens $0.0120 / 1K tokens # Davinci $0.0300 / 1K tokens $0.1200 / 1K tokens # ## Start fine-tuning # openai api fine_tunes.create --training_file output/finetune_data_prepared.jsonl --model davinci --suffix "GenSim" # subprocess.run('openai api fine_tunes.create --training_file output/finetune_data_prepared.jsonl --model davinci --suffix "GenSim"'.split()) # Tracking Finetune Status # openai api fine_tunes.follow -i # openai api fine_tunes.get -i # openai wandb sync