Skip to content

Commit 0da3423

Browse files
committed
Create vllm_client.py
1 parent 1d04d30 commit 0da3423

1 file changed

Lines changed: 247 additions & 0 deletions

File tree

‎modelsync/llm/vllm_client.py‎

Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
"""
2+
Cliente para la API de vLLM integrada con ModelSync
3+
"""
4+
5+
import requests
6+
import json
7+
from typing import List, Optional, Dict, Any
8+
from datetime import datetime
9+
10+
class VLLMClient:
11+
"""Cliente para interactuar con la API de vLLM integrada con ModelSync"""
12+
13+
def __init__(self, base_url: str = "http://localhost:8001"):
14+
self.base_url = base_url.rstrip('/')
15+
self.session = requests.Session()
16+
17+
def health_check(self) -> Dict[str, Any]:
18+
"""Verificar el estado del servicio"""
19+
response = self.session.get(f"{self.base_url}/health")
20+
response.raise_for_status()
21+
return response.json()
22+
23+
def list_models(self) -> List[Dict[str, Any]]:
24+
"""Listar modelos disponibles"""
25+
response = self.session.get(f"{self.base_url}/models")
26+
response.raise_for_status()
27+
return response.json()
28+
29+
def generate(
30+
self,
31+
prompt: str,
32+
max_tokens: int = 100,
33+
temperature: float = 0.7,
34+
top_p: float = 0.9,
35+
top_k: int = 50,
36+
stop: Optional[List[str]] = None,
37+
model_name: Optional[str] = None,
38+
save_to_version_control: bool = True
39+
) -> Dict[str, Any]:
40+
"""Generar texto con integración ModelSync"""
41+
payload = {
42+
"prompt": prompt,
43+
"max_tokens": max_tokens,
44+
"temperature": temperature,
45+
"top_p": top_p,
46+
"top_k": top_k,
47+
"stream": False,
48+
"save_to_version_control": save_to_version_control
49+
}
50+
51+
if stop:
52+
payload["stop"] = stop
53+
if model_name:
54+
payload["model_name"] = model_name
55+
56+
response = self.session.post(f"{self.base_url}/generate", json=payload)
57+
response.raise_for_status()
58+
return response.json()
59+
60+
def generate_batch(
61+
self,
62+
prompts: List[str],
63+
max_tokens: int = 100,
64+
temperature: float = 0.7,
65+
top_p: float = 0.9,
66+
top_k: int = 50,
67+
stop: Optional[List[str]] = None,
68+
save_to_version_control: bool = True
69+
) -> List[Dict[str, Any]]:
70+
"""Generar texto para múltiples prompts en lote"""
71+
requests_data = []
72+
for prompt in prompts:
73+
request_data = {
74+
"prompt": prompt,
75+
"max_tokens": max_tokens,
76+
"temperature": temperature,
77+
"top_p": top_p,
78+
"top_k": top_k,
79+
"stream": False,
80+
"save_to_version_control": save_to_version_control
81+
}
82+
if stop:
83+
request_data["stop"] = stop
84+
requests_data.append(request_data)
85+
86+
response = self.session.post(f"{self.base_url}/generate/batch", json=requests_data)
87+
response.raise_for_status()
88+
return response.json()
89+
90+
def get_modelsync_status(self) -> Dict[str, Any]:
91+
"""Obtener estado de la integración ModelSync"""
92+
response = self.session.get(f"{self.base_url}/modelsync/status")
93+
response.raise_for_status()
94+
return response.json()
95+
96+
def init_modelsync(
97+
self,
98+
user_name: str = "vLLM API User",
99+
user_email: str = "vllm@modelsync.local"
100+
) -> Dict[str, Any]:
101+
"""Inicializar repositorio ModelSync"""
102+
response = self.session.post(
103+
f"{self.base_url}/modelsync/init",
104+
params={"user_name": user_name, "user_email": user_email}
105+
)
106+
response.raise_for_status()
107+
return response.json()
108+
109+
def get_metrics(self) -> Dict[str, Any]:
110+
"""Obtener métricas del servicio"""
111+
response = self.session.get(f"{self.base_url}/metrics")
112+
response.raise_for_status()
113+
return response.json()
114+
115+
class VLLMExperimentManager:
116+
"""Gestor de experimentos para vLLM con ModelSync"""
117+
118+
def __init__(self, client: VLLMClient):
119+
self.client = client
120+
121+
def run_experiment(
122+
self,
123+
experiment_name: str,
124+
prompts: List[str],
125+
parameters: Dict[str, Any],
126+
description: str = ""
127+
) -> Dict[str, Any]:
128+
"""Ejecutar un experimento con diferentes parámetros"""
129+
results = []
130+
131+
for i, prompt in enumerate(prompts):
132+
try:
133+
response = self.client.generate(
134+
prompt=prompt,
135+
**parameters,
136+
save_to_version_control=True
137+
)
138+
139+
results.append({
140+
"prompt_index": i,
141+
"prompt": prompt,
142+
"response": response["text"],
143+
"model_version_id": response.get("model_version_id"),
144+
"usage": response["usage"],
145+
"created": response["created"]
146+
})
147+
148+
except Exception as e:
149+
results.append({
150+
"prompt_index": i,
151+
"prompt": prompt,
152+
"error": str(e),
153+
"created": datetime.now().isoformat()
154+
})
155+
156+
# Crear resumen del experimento
157+
experiment_summary = {
158+
"experiment_name": experiment_name,
159+
"description": description,
160+
"parameters": parameters,
161+
"total_prompts": len(prompts),
162+
"successful_generations": len([r for r in results if "error" not in r]),
163+
"failed_generations": len([r for r in results if "error" in r]),
164+
"total_tokens": sum(r.get("usage", {}).get("total_tokens", 0) for r in results if "usage" in r),
165+
"results": results,
166+
"created": datetime.now().isoformat()
167+
}
168+
169+
return experiment_summary
170+
171+
def compare_parameters(
172+
self,
173+
base_prompts: List[str],
174+
parameter_sets: List[Dict[str, Any]],
175+
experiment_name: str = "parameter_comparison"
176+
) -> Dict[str, Any]:
177+
"""Comparar diferentes conjuntos de parámetros"""
178+
comparison_results = []
179+
180+
for i, params in enumerate(parameter_sets):
181+
param_name = f"param_set_{i+1}"
182+
experiment_result = self.run_experiment(
183+
experiment_name=f"{experiment_name}_{param_name}",
184+
prompts=base_prompts,
185+
parameters=params,
186+
description=f"Parameter set {i+1}: {params}"
187+
)
188+
189+
comparison_results.append({
190+
"parameter_set": params,
191+
"parameter_name": param_name,
192+
"experiment_result": experiment_result
193+
})
194+
195+
return {
196+
"comparison_name": experiment_name,
197+
"base_prompts": base_prompts,
198+
"parameter_sets": parameter_sets,
199+
"results": comparison_results,
200+
"created": datetime.now().isoformat()
201+
}
202+
203+
# Ejemplo de uso
204+
if __name__ == "__main__":
205+
client = VLLMClient()
206+
207+
# Verificar salud
208+
health = client.health_check()
209+
print(f"Estado del servicio: {health}")
210+
211+
# Verificar estado de ModelSync
212+
modelsync_status = client.get_modelsync_status()
213+
print(f"Estado ModelSync: {modelsync_status}")
214+
215+
# Inicializar ModelSync si es necesario
216+
if modelsync_status["status"] == "not_initialized":
217+
init_result = client.init_modelsync()
218+
print(f"Inicialización ModelSync: {init_result}")
219+
220+
# Generar texto
221+
response = client.generate(
222+
prompt="Hola, ¿cómo estás?",
223+
max_tokens=50,
224+
temperature=0.7
225+
)
226+
print(f"Respuesta: {response['text']}")
227+
print(f"Versión del modelo: {response.get('model_version_id', 'No guardado')}")
228+
229+
# Ejemplo de experimento
230+
experiment_manager = VLLMExperimentManager(client)
231+
232+
experiment_result = experiment_manager.run_experiment(
233+
experiment_name="test_experiment",
234+
prompts=[
235+
"Cuéntame un chiste",
236+
"Explica qué es la inteligencia artificial",
237+
"¿Cuál es la capital de Francia?"
238+
],
239+
parameters={
240+
"max_tokens": 30,
241+
"temperature": 0.7,
242+
"top_p": 0.9
243+
},
244+
description="Experimento de prueba con diferentes prompts"
245+
)
246+
247+
print(f"Experimento completado: {experiment_result['successful_generations']}/{experiment_result['total_prompts']} exitosos")

0 commit comments

Comments
 (0)