Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
improve get available model provider
Browse files
backend/config/models_config.py
CHANGED
@@ -5,6 +5,7 @@ This file centralizes all configurations related to models and providers used in
|
|
5 |
"""
|
6 |
|
7 |
# Definition of preferred providers, used in get_available_model_provider.py
|
|
|
8 |
PREFERRED_PROVIDERS = ["fireworks-ai", "sambanova", "novita"]
|
9 |
|
10 |
# Default models to evaluate for evaluation
|
@@ -18,13 +19,21 @@ DEFAULT_EVALUATION_MODELS = [
|
|
18 |
"mistralai/Mistral-Small-24B-Instruct-2501",
|
19 |
]
|
20 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
# "Qwen/Qwen2.5-72B-Instruct"
|
22 |
# "meta-llama/Llama-3.1-8B-Instruct"
|
23 |
# "Qwen/Qwen2.5-32B-Instruct",
|
24 |
# "deepseek-ai/DeepSeek-R1-Distill-Llama-70B",
|
25 |
|
26 |
# Required model for create_bench_config_file.py (only one default model)
|
27 |
-
DEFAULT_BENCHMARK_MODEL = "
|
28 |
|
29 |
# Models by roles for benchmark configuration
|
30 |
# All roles use the default model except chunking
|
|
|
5 |
"""
|
6 |
|
7 |
# Definition of preferred providers, used in get_available_model_provider.py
|
8 |
+
# PREFERRED_PROVIDERS = ["sambanova", "novita"]
|
9 |
PREFERRED_PROVIDERS = ["fireworks-ai", "sambanova", "novita"]
|
10 |
|
11 |
# Default models to evaluate for evaluation
|
|
|
19 |
"mistralai/Mistral-Small-24B-Instruct-2501",
|
20 |
]
|
21 |
|
22 |
+
# Modèles alternatifs à utiliser si le modèle par défaut n'est pas disponible
|
23 |
+
ALTERNATIVE_BENCHMARK_MODELS = [
|
24 |
+
"meta-llama/Llama-3.3-70B-Instruct",
|
25 |
+
"meta-llama/Llama-3.1-8B-Instruct",
|
26 |
+
"Qwen/Qwen2.5-72B-Instruct",
|
27 |
+
"mistralai/Mistral-Small-24B-Instruct-2501",
|
28 |
+
]
|
29 |
+
|
30 |
# "Qwen/Qwen2.5-72B-Instruct"
|
31 |
# "meta-llama/Llama-3.1-8B-Instruct"
|
32 |
# "Qwen/Qwen2.5-32B-Instruct",
|
33 |
# "deepseek-ai/DeepSeek-R1-Distill-Llama-70B",
|
34 |
|
35 |
# Required model for create_bench_config_file.py (only one default model)
|
36 |
+
DEFAULT_BENCHMARK_MODEL = "deepseek-ai/DeepSeek-R1-Distill-Llama-70B"
|
37 |
|
38 |
# Models by roles for benchmark configuration
|
39 |
# All roles use the default model except chunking
|
backend/tasks/create_bench_config_file.py
CHANGED
@@ -18,6 +18,8 @@ from config.models_config import (
|
|
18 |
DEFAULT_BENCHMARK_MODEL,
|
19 |
BENCHMARK_MODEL_ROLES,
|
20 |
DEFAULT_BENCHMARK_TIMEOUT,
|
|
|
|
|
21 |
)
|
22 |
|
23 |
|
@@ -96,14 +98,44 @@ class CreateBenchConfigTask:
|
|
96 |
Available provider or None if none found
|
97 |
"""
|
98 |
self._add_log(f"[INFO] Finding available provider for {model_name}")
|
|
|
|
|
99 |
provider = get_available_model_provider(model_name, verbose=True)
|
100 |
|
101 |
if provider:
|
102 |
self._add_log(f"[INFO] Found provider for {model_name}: {provider}")
|
103 |
return provider
|
104 |
-
|
105 |
-
|
106 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
107 |
|
108 |
def generate_base_config(self, hf_org: str, hf_dataset_name: str) -> Dict[str, Any]:
|
109 |
"""
|
@@ -125,19 +157,46 @@ class CreateBenchConfigTask:
|
|
125 |
|
126 |
# Get provider for the default model
|
127 |
provider = self.get_model_provider(DEFAULT_BENCHMARK_MODEL)
|
|
|
|
|
|
|
|
|
128 |
if not provider:
|
129 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
self._add_log(f"[ERROR] {error_msg}")
|
131 |
raise RuntimeError(error_msg)
|
132 |
|
133 |
# Create model configuration
|
134 |
model_list = [{
|
135 |
-
"model_name":
|
136 |
"provider": provider,
|
137 |
"api_key": "$HF_TOKEN",
|
138 |
"max_concurrent_requests": 32,
|
139 |
}]
|
140 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
141 |
# Add minimum delay of 2 seconds for provider_check stage
|
142 |
self._add_log("[INFO] Finalizing provider check...")
|
143 |
time.sleep(2)
|
@@ -156,7 +215,7 @@ class CreateBenchConfigTask:
|
|
156 |
},
|
157 |
"model_list": model_list,
|
158 |
|
159 |
-
"model_roles":
|
160 |
"pipeline": {
|
161 |
"ingestion": {
|
162 |
"source_documents_dir": f"uploaded_files/{self.session_uid}/uploaded_files/",
|
|
|
18 |
DEFAULT_BENCHMARK_MODEL,
|
19 |
BENCHMARK_MODEL_ROLES,
|
20 |
DEFAULT_BENCHMARK_TIMEOUT,
|
21 |
+
PREFERRED_PROVIDERS,
|
22 |
+
ALTERNATIVE_BENCHMARK_MODELS,
|
23 |
)
|
24 |
|
25 |
|
|
|
98 |
Available provider or None if none found
|
99 |
"""
|
100 |
self._add_log(f"[INFO] Finding available provider for {model_name}")
|
101 |
+
|
102 |
+
# Essayer de trouver un provider pour le modèle
|
103 |
provider = get_available_model_provider(model_name, verbose=True)
|
104 |
|
105 |
if provider:
|
106 |
self._add_log(f"[INFO] Found provider for {model_name}: {provider}")
|
107 |
return provider
|
108 |
+
|
109 |
+
# Si aucun provider n'est trouvé avec la configuration préférée
|
110 |
+
# Essayons de trouver n'importe quel provider disponible en ignorant la préférence
|
111 |
+
from huggingface_hub import model_info
|
112 |
+
from tasks.get_available_model_provider import test_provider
|
113 |
+
|
114 |
+
self._add_log(f"[WARNING] No preferred provider found for {model_name}, trying all available providers...")
|
115 |
+
|
116 |
+
try:
|
117 |
+
# Obtenir tous les providers possibles pour ce modèle
|
118 |
+
info = model_info(model_name, expand="inferenceProviderMapping")
|
119 |
+
if hasattr(info, "inference_provider_mapping"):
|
120 |
+
providers = list(info.inference_provider_mapping.keys())
|
121 |
+
|
122 |
+
# Exclure les providers préférés déjà testés
|
123 |
+
other_providers = [p for p in providers if p not in PREFERRED_PROVIDERS]
|
124 |
+
|
125 |
+
if other_providers:
|
126 |
+
self._add_log(f"[INFO] Testing additional providers: {', '.join(other_providers)}")
|
127 |
+
|
128 |
+
# Tester chaque provider
|
129 |
+
for provider in other_providers:
|
130 |
+
self._add_log(f"[INFO] Testing provider {provider}")
|
131 |
+
if test_provider(model_name, provider, verbose=True):
|
132 |
+
self._add_log(f"[INFO] Found alternative provider for {model_name}: {provider}")
|
133 |
+
return provider
|
134 |
+
except Exception as e:
|
135 |
+
self._add_log(f"[WARNING] Error while testing additional providers: {str(e)}")
|
136 |
+
|
137 |
+
self._add_log(f"[WARNING] No available provider found for {model_name}")
|
138 |
+
return None
|
139 |
|
140 |
def generate_base_config(self, hf_org: str, hf_dataset_name: str) -> Dict[str, Any]:
|
141 |
"""
|
|
|
157 |
|
158 |
# Get provider for the default model
|
159 |
provider = self.get_model_provider(DEFAULT_BENCHMARK_MODEL)
|
160 |
+
|
161 |
+
# Si aucun provider n'est trouvé pour le modèle par défaut, essayer les modèles alternatifs
|
162 |
+
selected_model = DEFAULT_BENCHMARK_MODEL
|
163 |
+
|
164 |
if not provider:
|
165 |
+
self._add_log(f"[WARNING] Primary model {DEFAULT_BENCHMARK_MODEL} not available. Trying alternatives...")
|
166 |
+
|
167 |
+
# Utiliser la liste des modèles alternatifs depuis la configuration
|
168 |
+
for alt_model in ALTERNATIVE_BENCHMARK_MODELS:
|
169 |
+
self._add_log(f"[INFO] Trying alternative model: {alt_model}")
|
170 |
+
alt_provider = self.get_model_provider(alt_model)
|
171 |
+
if alt_provider:
|
172 |
+
self._add_log(f"[INFO] Found working alternative model: {alt_model} with provider: {alt_provider}")
|
173 |
+
selected_model = alt_model
|
174 |
+
provider = alt_provider
|
175 |
+
break
|
176 |
+
|
177 |
+
# Si toujours pas de provider, lever une exception
|
178 |
+
if not provider:
|
179 |
+
error_msg = "No model with available provider found. Cannot proceed with benchmark."
|
180 |
self._add_log(f"[ERROR] {error_msg}")
|
181 |
raise RuntimeError(error_msg)
|
182 |
|
183 |
# Create model configuration
|
184 |
model_list = [{
|
185 |
+
"model_name": selected_model,
|
186 |
"provider": provider,
|
187 |
"api_key": "$HF_TOKEN",
|
188 |
"max_concurrent_requests": 32,
|
189 |
}]
|
190 |
|
191 |
+
# Mettre à jour les roles de modèle si un modèle alternatif est utilisé
|
192 |
+
model_roles = dict(BENCHMARK_MODEL_ROLES)
|
193 |
+
if selected_model != DEFAULT_BENCHMARK_MODEL:
|
194 |
+
for role in model_roles:
|
195 |
+
if role != "chunking": # Ne pas changer le modèle de chunking
|
196 |
+
model_roles[role] = [selected_model]
|
197 |
+
|
198 |
+
self._add_log(f"[INFO] Updated model roles to use {selected_model}")
|
199 |
+
|
200 |
# Add minimum delay of 2 seconds for provider_check stage
|
201 |
self._add_log("[INFO] Finalizing provider check...")
|
202 |
time.sleep(2)
|
|
|
215 |
},
|
216 |
"model_list": model_list,
|
217 |
|
218 |
+
"model_roles": model_roles,
|
219 |
"pipeline": {
|
220 |
"ingestion": {
|
221 |
"source_documents_dir": f"uploaded_files/{self.session_uid}/uploaded_files/",
|
backend/tasks/get_available_model_provider.py
CHANGED
@@ -49,7 +49,7 @@ def test_provider(model_name: str, provider: str, verbose: bool = False) -> bool
|
|
49 |
token=hf_token,
|
50 |
provider=provider,
|
51 |
# bill_to=hf_organization,
|
52 |
-
timeout=
|
53 |
)
|
54 |
|
55 |
try:
|
@@ -99,35 +99,77 @@ def get_available_model_provider(model_name, verbose=False):
|
|
99 |
# Get HF token from environment
|
100 |
hf_token = os.environ.get("HF_TOKEN")
|
101 |
if not hf_token:
|
|
|
|
|
102 |
raise ValueError("HF_TOKEN not defined in environment")
|
103 |
|
104 |
# Get providers for the model and prioritize them
|
105 |
-
|
106 |
-
|
107 |
-
if
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
|
|
|
|
|
|
|
|
|
|
113 |
if verbose:
|
114 |
-
logger.
|
115 |
return None
|
116 |
|
117 |
# Prioritize providers
|
118 |
-
|
119 |
|
120 |
if verbose:
|
121 |
logger.info(f"Available providers for {model_name}: {', '.join(providers)}")
|
|
|
122 |
|
123 |
-
# Test each provider
|
124 |
-
|
125 |
-
|
126 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
|
128 |
# If we've tried all providers and none worked, log this but don't raise an exception
|
129 |
if verbose:
|
130 |
-
logger.error(f"No available providers for {model_name}")
|
131 |
return None
|
132 |
|
133 |
except Exception as e:
|
|
|
49 |
token=hf_token,
|
50 |
provider=provider,
|
51 |
# bill_to=hf_organization,
|
52 |
+
timeout=3 # Increased timeout to allow model loading
|
53 |
)
|
54 |
|
55 |
try:
|
|
|
99 |
# Get HF token from environment
|
100 |
hf_token = os.environ.get("HF_TOKEN")
|
101 |
if not hf_token:
|
102 |
+
if verbose:
|
103 |
+
logger.error("HF_TOKEN not defined in environment")
|
104 |
raise ValueError("HF_TOKEN not defined in environment")
|
105 |
|
106 |
# Get providers for the model and prioritize them
|
107 |
+
try:
|
108 |
+
info = model_info(model_name, expand="inferenceProviderMapping")
|
109 |
+
if not hasattr(info, "inference_provider_mapping"):
|
110 |
+
if verbose:
|
111 |
+
logger.info(f"No inference providers found for {model_name}")
|
112 |
+
return None
|
113 |
+
|
114 |
+
providers = list(info.inference_provider_mapping.keys())
|
115 |
+
if not providers:
|
116 |
+
if verbose:
|
117 |
+
logger.info(f"Empty list of providers for {model_name}")
|
118 |
+
return None
|
119 |
+
except Exception as e:
|
120 |
if verbose:
|
121 |
+
logger.error(f"Error retrieving model info for {model_name}: {str(e)}")
|
122 |
return None
|
123 |
|
124 |
# Prioritize providers
|
125 |
+
prioritized_providers = prioritize_providers(providers)
|
126 |
|
127 |
if verbose:
|
128 |
logger.info(f"Available providers for {model_name}: {', '.join(providers)}")
|
129 |
+
logger.info(f"Prioritized providers: {', '.join(prioritized_providers)}")
|
130 |
|
131 |
+
# Test each preferred provider first
|
132 |
+
failed_providers = []
|
133 |
+
for provider in prioritized_providers:
|
134 |
+
if verbose:
|
135 |
+
logger.info(f"Testing provider {provider} for {model_name}")
|
136 |
+
|
137 |
+
try:
|
138 |
+
if test_provider(model_name, provider, verbose):
|
139 |
+
if verbose:
|
140 |
+
logger.info(f"Provider {provider} is available for {model_name}")
|
141 |
+
return provider
|
142 |
+
else:
|
143 |
+
failed_providers.append(provider)
|
144 |
+
if verbose:
|
145 |
+
logger.warning(f"Provider {provider} test failed for {model_name}")
|
146 |
+
except Exception as e:
|
147 |
+
failed_providers.append(provider)
|
148 |
+
if verbose:
|
149 |
+
logger.error(f"Exception while testing provider {provider} for {model_name}: {str(e)}")
|
150 |
+
|
151 |
+
# If all prioritized providers failed, try any remaining providers
|
152 |
+
remaining_providers = [p for p in providers if p not in prioritized_providers and p not in failed_providers]
|
153 |
+
|
154 |
+
if remaining_providers and verbose:
|
155 |
+
logger.info(f"Trying remaining non-prioritized providers: {', '.join(remaining_providers)}")
|
156 |
+
|
157 |
+
for provider in remaining_providers:
|
158 |
+
if verbose:
|
159 |
+
logger.info(f"Testing non-prioritized provider {provider} for {model_name}")
|
160 |
+
|
161 |
+
try:
|
162 |
+
if test_provider(model_name, provider, verbose):
|
163 |
+
if verbose:
|
164 |
+
logger.info(f"Non-prioritized provider {provider} is available for {model_name}")
|
165 |
+
return provider
|
166 |
+
except Exception as e:
|
167 |
+
if verbose:
|
168 |
+
logger.error(f"Exception while testing non-prioritized provider {provider}: {str(e)}")
|
169 |
|
170 |
# If we've tried all providers and none worked, log this but don't raise an exception
|
171 |
if verbose:
|
172 |
+
logger.error(f"No available providers for {model_name}. Tried {len(failed_providers + remaining_providers)} providers.")
|
173 |
return None
|
174 |
|
175 |
except Exception as e:
|
frontend/src/components/Benchmark/Display.jsx
CHANGED
@@ -51,18 +51,18 @@ const Display = ({
|
|
51 |
|
52 |
setIsDownloading(true);
|
53 |
try {
|
54 |
-
// Requête pour télécharger
|
55 |
-
const downloadUrl = `${API_CONFIG.BASE_URL}/download-
|
56 |
|
57 |
// Créer un élément a temporaire pour déclencher le téléchargement
|
58 |
const link = document.createElement("a");
|
59 |
link.href = downloadUrl;
|
60 |
-
link.setAttribute("download", `yourbench_${sessionId}
|
61 |
document.body.appendChild(link);
|
62 |
link.click();
|
63 |
document.body.removeChild(link);
|
64 |
} catch (error) {
|
65 |
-
console.error("Erreur lors du téléchargement
|
66 |
alert("Erreur lors du téléchargement. Veuillez réessayer.");
|
67 |
} finally {
|
68 |
setIsDownloading(false);
|
@@ -85,7 +85,7 @@ const Display = ({
|
|
85 |
</Box>
|
86 |
|
87 |
<Box sx={{ display: "flex", gap: 2 }}>
|
88 |
-
<Tooltip title="Download the
|
89 |
<Button
|
90 |
variant="outlined"
|
91 |
color="primary"
|
@@ -99,7 +99,7 @@ const Display = ({
|
|
99 |
onClick={handleDownloadClick}
|
100 |
disabled={isDownloading || !sessionId}
|
101 |
>
|
102 |
-
{isDownloading ? "Downloading..." : "Download
|
103 |
</Button>
|
104 |
</Tooltip>
|
105 |
|
|
|
51 |
|
52 |
setIsDownloading(true);
|
53 |
try {
|
54 |
+
// Requête pour télécharger les questions JSON au lieu du dataset
|
55 |
+
const downloadUrl = `${API_CONFIG.BASE_URL}/download-questions/${sessionId}`;
|
56 |
|
57 |
// Créer un élément a temporaire pour déclencher le téléchargement
|
58 |
const link = document.createElement("a");
|
59 |
link.href = downloadUrl;
|
60 |
+
link.setAttribute("download", `yourbench_${sessionId}_questions.json`);
|
61 |
document.body.appendChild(link);
|
62 |
link.click();
|
63 |
document.body.removeChild(link);
|
64 |
} catch (error) {
|
65 |
+
console.error("Erreur lors du téléchargement des questions:", error);
|
66 |
alert("Erreur lors du téléchargement. Veuillez réessayer.");
|
67 |
} finally {
|
68 |
setIsDownloading(false);
|
|
|
85 |
</Box>
|
86 |
|
87 |
<Box sx={{ display: "flex", gap: 2 }}>
|
88 |
+
<Tooltip title="Download the benchmark questions in JSON format">
|
89 |
<Button
|
90 |
variant="outlined"
|
91 |
color="primary"
|
|
|
99 |
onClick={handleDownloadClick}
|
100 |
disabled={isDownloading || !sessionId}
|
101 |
>
|
102 |
+
{isDownloading ? "Downloading..." : "Download Questions JSON"}
|
103 |
</Button>
|
104 |
</Tooltip>
|
105 |
|