Feat: Support audio in Phi4-mm model (#8048)

This commit is contained in:
Binyao Jiang
2025-07-18 21:03:53 -07:00
committed by GitHub
parent d918ab7985
commit b7e951a6db
11 changed files with 3333 additions and 54 deletions

View File

@@ -200,16 +200,17 @@ class TestPhi4MMServer(TestOpenAIVisionServer):
"0.70",
"--disable-radix-cache",
"--max-loras-per-batch",
"1",
"2",
"--revision",
revision,
"--lora-paths",
f"vision={constants.HF_HUB_CACHE}/models--microsoft--Phi-4-multimodal-instruct/snapshots/{revision}/vision-lora",
f"speech={constants.HF_HUB_CACHE}/models--microsoft--Phi-4-multimodal-instruct/snapshots/{revision}/speech-lora",
],
)
cls.base_url += "/v1"
def get_request_kwargs(self):
def get_vision_request_kwargs(self):
return {
"extra_body": {
"lora_path": "vision",
@@ -218,8 +219,21 @@ class TestPhi4MMServer(TestOpenAIVisionServer):
}
}
def test_video_chat_completion(self):
pass
def get_audio_request_kwargs(self):
return {
"extra_body": {
"lora_path": "speech",
"top_k": 1,
"top_p": 1.0,
}
}
def test_audio_chat_completion(self):
self._test_audio_speech_completion()
# TODO: currently phi4-mm cannot pass this test.
# We are investigating this issue.
# Response: La ciudad está situada en la costa este de la isla, en la desembocadura del río St. Lawrence.
# self._test_audio_ambient_completion()
class TestVILAServer(TestOpenAIVisionServer):

View File

@@ -47,6 +47,12 @@ class TestOpenAIVisionServer(CustomTestCase):
def tearDownClass(cls):
kill_process_tree(cls.process.pid)
def get_audio_request_kwargs(self):
return self.get_request_kwargs()
def get_vision_request_kwargs(self):
return self.get_request_kwargs()
def get_request_kwargs(self):
return {}
@@ -71,7 +77,7 @@ class TestOpenAIVisionServer(CustomTestCase):
},
],
temperature=0,
**(self.get_request_kwargs()),
**(self.get_vision_request_kwargs()),
)
assert response.choices[0].message.role == "assistant"
@@ -134,7 +140,7 @@ class TestOpenAIVisionServer(CustomTestCase):
},
],
temperature=0,
**(self.get_request_kwargs()),
**(self.get_vision_request_kwargs()),
)
assert response.choices[0].message.role == "assistant"
@@ -177,7 +183,7 @@ class TestOpenAIVisionServer(CustomTestCase):
},
],
temperature=0,
**(self.get_request_kwargs()),
**(self.get_vision_request_kwargs()),
)
assert response.choices[0].message.role == "assistant"
@@ -333,7 +339,7 @@ class TestOpenAIVisionServer(CustomTestCase):
temperature=0,
max_tokens=1024,
stream=False,
**(self.get_request_kwargs()),
**(self.get_vision_request_kwargs()),
)
video_response = response.choices[0].message.content
@@ -376,7 +382,7 @@ class TestOpenAIVisionServer(CustomTestCase):
+ r"""\}"""
)
extra_kwargs = self.get_request_kwargs()
extra_kwargs = self.get_vision_request_kwargs()
extra_kwargs.setdefault("extra_body", {})["regex"] = regex
response = client.chat.completions.create(
@@ -443,7 +449,7 @@ class TestOpenAIVisionServer(CustomTestCase):
{"role": "user", "content": content},
],
temperature=0,
**(self.get_request_kwargs()),
**(self.get_vision_request_kwargs()),
)
assert response.choices[0].message.role == "assistant"
@@ -486,7 +492,7 @@ class TestOpenAIVisionServer(CustomTestCase):
temperature=0,
max_tokens=128,
stream=False,
**(self.get_request_kwargs()),
**(self.get_audio_request_kwargs()),
)
audio_response = response.choices[0].message.content
@@ -500,7 +506,7 @@ class TestOpenAIVisionServer(CustomTestCase):
self.assertIsNotNone(audio_response)
self.assertGreater(len(audio_response), 0)
return audio_response
return audio_response.lower()
def _test_audio_speech_completion(self):
# a fragment of Trump's speech