tfrere commited on
Commit
d2805fc
·
1 Parent(s): 8695aa8

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 = "Qwen/Qwen2.5-32B-Instruct"
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
- else:
105
- self._add_log(f"[WARNING] No available provider found for {model_name}")
106
- return None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- error_msg = f"Required model not available: {DEFAULT_BENCHMARK_MODEL}. Cannot proceed with benchmark."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  self._add_log(f"[ERROR] {error_msg}")
131
  raise RuntimeError(error_msg)
132
 
133
  # Create model configuration
134
  model_list = [{
135
- "model_name": DEFAULT_BENCHMARK_MODEL,
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": BENCHMARK_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=10 # Increased timeout to allow model loading
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
- info = model_info(model_name, expand="inferenceProviderMapping")
106
- if not hasattr(info, "inference_provider_mapping"):
107
- if verbose:
108
- logger.info(f"No inference providers found for {model_name}")
109
- return None
110
-
111
- providers = list(info.inference_provider_mapping.keys())
112
- if not providers:
 
 
 
 
 
113
  if verbose:
114
- logger.info(f"Empty list of providers for {model_name}")
115
  return None
116
 
117
  # Prioritize providers
118
- providers = prioritize_providers(providers)
119
 
120
  if verbose:
121
  logger.info(f"Available providers for {model_name}: {', '.join(providers)}")
 
122
 
123
- # Test each provider
124
- for provider in providers:
125
- if test_provider(model_name, provider, verbose):
126
- return provider
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 le dataset
55
- const downloadUrl = `${API_CONFIG.BASE_URL}/download-dataset/${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}_dataset.zip`);
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 du dataset:", error);
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 complete benchmark">
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 Benchmark"}
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