From 4917aaefab47678aec1036114b33722ef4803632 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Sat, 3 Aug 2024 08:40:35 -0700 Subject: [PATCH 1/4] fix vertex credentials --- litellm/types/router.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/types/router.py b/litellm/types/router.py index 7fc96155422..bb6d0d809b0 100644 --- a/litellm/types/router.py +++ b/litellm/types/router.py @@ -179,6 +179,7 @@ class GenericLiteLLMParams(BaseModel): ## VERTEX AI ## vertex_project: Optional[str] = None, vertex_location: Optional[str] = None, + vertex_credentials: Optional[str] = None, ## AWS BEDROCK / SAGEMAKER ## aws_access_key_id: Optional[str] = None, aws_secret_access_key: Optional[str] = None, From 69e5a7cb68bc379bb350bf7c313af60b12dcd676 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Sat, 3 Aug 2024 08:44:54 -0700 Subject: [PATCH 2/4] test translating to vertex ai params --- litellm/fine_tuning/main.py | 1 + litellm/llms/fine_tuning_apis/vertex_ai.py | 32 +++++++++--- litellm/tests/test_fine_tuning_api.py | 61 ++++++++++++++++++++++ 3 files changed, 88 insertions(+), 6 deletions(-) diff --git a/litellm/fine_tuning/main.py b/litellm/fine_tuning/main.py index ca31b30b3bb..abf28285782 100644 --- a/litellm/fine_tuning/main.py +++ b/litellm/fine_tuning/main.py @@ -255,6 +255,7 @@ def create_fine_tuning_job( vertex_location=vertex_ai_location, timeout=timeout, api_base=api_base, + kwargs=kwargs, ) else: raise litellm.exceptions.BadRequestError( diff --git a/litellm/llms/fine_tuning_apis/vertex_ai.py b/litellm/llms/fine_tuning_apis/vertex_ai.py index 7f3327d7b4c..0fd882c815e 100644 --- a/litellm/llms/fine_tuning_apis/vertex_ai.py +++ b/litellm/llms/fine_tuning_apis/vertex_ai.py @@ -86,6 +86,29 @@ class VertexFineTuningAPI(VertexLLM): integrations=[], ) + def convert_openai_request_to_vertex( + self, create_fine_tuning_job_data: FineTuningJobCreate, **kwargs + ) -> dict: + """ + convert request from OpenAI format to Vertex format + https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/tuning + supervised_tuning_spec = FineTunesupervisedTuningSpec( + """ + supervised_tuning_spec = FineTunesupervisedTuningSpec( + training_dataset_uri=create_fine_tuning_job_data.training_file, + validation_dataset=create_fine_tuning_job_data.validation_file, + epoch_count=create_fine_tuning_job_data.hyperparameters.n_epochs, + learning_rate_multiplier=create_fine_tuning_job_data.hyperparameters.learning_rate_multiplier, + adapter_size=kwargs.get("AdapterSize"), + ) + fine_tune_job = FineTuneJobCreate( + baseModel=create_fine_tuning_job_data.model, + supervisedTuningSpec=supervised_tuning_spec, + tunedModelDisplayName=create_fine_tuning_job_data.suffix, + ) + + return fine_tune_job + async def acreate_fine_tuning_job( self, fine_tuning_url: str, @@ -144,6 +167,7 @@ class VertexFineTuningAPI(VertexLLM): vertex_credentials: Optional[str], api_base: Optional[str], timeout: Union[float, httpx.Timeout], + **kwargs, ): verbose_logger.debug( @@ -166,12 +190,8 @@ class VertexFineTuningAPI(VertexLLM): "Content-Type": "application/json", } - supervised_tuning_spec = FineTunesupervisedTuningSpec( - training_dataset_uri=create_fine_tuning_job_data.training_file - ) - fine_tune_job = FineTuneJobCreate( - baseModel=create_fine_tuning_job_data.model, - supervisedTuningSpec=supervised_tuning_spec, + fine_tune_job = self.convert_openai_request_to_vertex( + create_fine_tuning_job_data=create_fine_tuning_job_data, **kwargs ) fine_tuning_url = f"https://{vertex_location}-aiplatform.googleapis.com/v1/projects/{vertex_project}/locations/{vertex_location}/tuningJobs" diff --git a/litellm/tests/test_fine_tuning_api.py b/litellm/tests/test_fine_tuning_api.py index 4a46454b6aa..6adb5e36906 100644 --- a/litellm/tests/test_fine_tuning_api.py +++ b/litellm/tests/test_fine_tuning_api.py @@ -20,6 +20,12 @@ from test_gcs_bucket import load_vertex_ai_credentials from litellm import create_fine_tuning_job from litellm._logging import verbose_logger +from litellm.llms.fine_tuning_apis.vertex_ai import ( + FineTuningJobCreate, + VertexFineTuningAPI, +) + +vertex_finetune_api = VertexFineTuningAPI() def test_create_fine_tune_job(): @@ -210,3 +216,58 @@ async def test_create_vertex_fine_tune_jobs(): assert create_fine_tuning_response.object == "fine_tuning.job" except: pass + + +# Testing OpenAI -> Vertex AI param mapping + + +def test_convert_openai_request_to_vertex_basic(): + openai_data = FineTuningJobCreate( + training_file="gs://bucket/train.jsonl", + validation_file="gs://bucket/val.jsonl", + model="text-davinci-002", + hyperparameters={"n_epochs": 3, "learning_rate_multiplier": 0.1}, + suffix="my_fine_tuned_model", + ) + + result = vertex_finetune_api.convert_openai_request_to_vertex(openai_data) + + print("converted vertex ai result=", result) + + assert result["baseModel"] == "text-davinci-002" + assert result["tunedModelDisplayName"] == "my_fine_tuned_model" + assert ( + result["supervisedTuningSpec"]["training_dataset_uri"] + == "gs://bucket/train.jsonl" + ) + assert ( + result["supervisedTuningSpec"]["validation_dataset"] == "gs://bucket/val.jsonl" + ) + assert result["supervisedTuningSpec"]["epoch_count"] == 3 + assert result["supervisedTuningSpec"]["learning_rate_multiplier"] == 0.1 + + +def test_convert_openai_request_to_vertex_with_adapter_size(): + openai_data = FineTuningJobCreate( + training_file="gs://bucket/train.jsonl", + model="text-davinci-002", + hyperparameters={"n_epochs": 5, "learning_rate_multiplier": 0.2}, + suffix="custom_model", + ) + + result = vertex_finetune_api.convert_openai_request_to_vertex( + openai_data, AdapterSize="SMALL" + ) + + print("converted vertex ai result=", result) + + assert result["baseModel"] == "text-davinci-002" + assert result["tunedModelDisplayName"] == "custom_model" + assert ( + result["supervisedTuningSpec"]["training_dataset_uri"] + == "gs://bucket/train.jsonl" + ) + assert result["supervisedTuningSpec"]["validation_dataset"] is None + assert result["supervisedTuningSpec"]["epoch_count"] == 5 + assert result["supervisedTuningSpec"]["learning_rate_multiplier"] == 0.2 + assert result["supervisedTuningSpec"]["adapter_size"] == "SMALL" From 4ca046439520f9d62887c17afb251901d505dbb5 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Sat, 3 Aug 2024 08:55:36 -0700 Subject: [PATCH 3/4] fix linting errors --- litellm/llms/fine_tuning_apis/vertex_ai.py | 19 ++++++++++++++----- litellm/tests/test_fine_tuning_api.py | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/litellm/llms/fine_tuning_apis/vertex_ai.py b/litellm/llms/fine_tuning_apis/vertex_ai.py index 0fd882c815e..4c5938e68e9 100644 --- a/litellm/llms/fine_tuning_apis/vertex_ai.py +++ b/litellm/llms/fine_tuning_apis/vertex_ai.py @@ -88,19 +88,28 @@ class VertexFineTuningAPI(VertexLLM): def convert_openai_request_to_vertex( self, create_fine_tuning_job_data: FineTuningJobCreate, **kwargs - ) -> dict: + ) -> FineTuningJobCreate: """ convert request from OpenAI format to Vertex format https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/tuning supervised_tuning_spec = FineTunesupervisedTuningSpec( """ + hyperparameters = create_fine_tuning_job_data.hyperparameters supervised_tuning_spec = FineTunesupervisedTuningSpec( training_dataset_uri=create_fine_tuning_job_data.training_file, validation_dataset=create_fine_tuning_job_data.validation_file, - epoch_count=create_fine_tuning_job_data.hyperparameters.n_epochs, - learning_rate_multiplier=create_fine_tuning_job_data.hyperparameters.learning_rate_multiplier, - adapter_size=kwargs.get("AdapterSize"), ) + + if hyperparameters: + if hyperparameters.n_epochs: + supervised_tuning_spec["epoch_count"] = int(hyperparameters.n_epochs) + if hyperparameters.learning_rate_multiplier: + supervised_tuning_spec["learning_rate_multiplier"] = float( + hyperparameters.learning_rate_multiplier + ) + + supervised_tuning_spec["adapter_size"] = kwargs.get("adapter_size") + fine_tune_job = FineTuneJobCreate( baseModel=create_fine_tuning_job_data.model, supervisedTuningSpec=supervised_tuning_spec, @@ -113,7 +122,7 @@ class VertexFineTuningAPI(VertexLLM): self, fine_tuning_url: str, headers: dict, - request_data: FineTuneJobCreate, + request_data: FineTuningJobCreate, ): from litellm.fine_tuning.main import FineTuningJob diff --git a/litellm/tests/test_fine_tuning_api.py b/litellm/tests/test_fine_tuning_api.py index 6adb5e36906..4eebcd2f7fd 100644 --- a/litellm/tests/test_fine_tuning_api.py +++ b/litellm/tests/test_fine_tuning_api.py @@ -256,7 +256,7 @@ def test_convert_openai_request_to_vertex_with_adapter_size(): ) result = vertex_finetune_api.convert_openai_request_to_vertex( - openai_data, AdapterSize="SMALL" + openai_data, adapter_size="SMALL" ) print("converted vertex ai result=", result) From 9958c52f773397c0e53a8bec8a30f17864826218 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Sat, 3 Aug 2024 08:56:54 -0700 Subject: [PATCH 4/4] fix vertex ai --- litellm/llms/fine_tuning_apis/vertex_ai.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/litellm/llms/fine_tuning_apis/vertex_ai.py b/litellm/llms/fine_tuning_apis/vertex_ai.py index 4c5938e68e9..f370652d269 100644 --- a/litellm/llms/fine_tuning_apis/vertex_ai.py +++ b/litellm/llms/fine_tuning_apis/vertex_ai.py @@ -88,7 +88,7 @@ class VertexFineTuningAPI(VertexLLM): def convert_openai_request_to_vertex( self, create_fine_tuning_job_data: FineTuningJobCreate, **kwargs - ) -> FineTuningJobCreate: + ) -> FineTuneJobCreate: """ convert request from OpenAI format to Vertex format https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/tuning @@ -122,7 +122,7 @@ class VertexFineTuningAPI(VertexLLM): self, fine_tuning_url: str, headers: dict, - request_data: FineTuningJobCreate, + request_data: FineTuneJobCreate, ): from litellm.fine_tuning.main import FineTuningJob