Spaces:
Running
Running
Joseph Pollack
commited on
removes trackio for testing
Browse files- interface.py +26 -8
- scripts/deploy_demo_space.py +53 -51
- scripts/train.py +2 -4
- scripts/train_lora.py +2 -4
interface.py
CHANGED
@@ -460,11 +460,20 @@ def start_voxtral_training(
|
|
460 |
# Collect all logs
|
461 |
all_logs = []
|
462 |
|
463 |
-
def
|
464 |
-
"""
|
|
|
|
|
465 |
for line in generator:
|
466 |
all_logs.append(line)
|
467 |
-
print(line)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
468 |
|
469 |
try:
|
470 |
# 1) Train
|
@@ -493,7 +502,10 @@ def start_voxtral_training(
|
|
493 |
args += ["--freeze-audio-tower"]
|
494 |
|
495 |
all_logs.append("🚀 Starting Voxtral training...")
|
496 |
-
|
|
|
|
|
|
|
497 |
all_logs.append("✅ Training completed!")
|
498 |
|
499 |
# 2) Push to Hub
|
@@ -505,8 +517,11 @@ def start_voxtral_training(
|
|
505 |
full_repo_name,
|
506 |
]
|
507 |
all_logs.append(f"📤 Pushing model to Hugging Face Hub: {full_repo_name}")
|
508 |
-
|
509 |
-
|
|
|
|
|
|
|
510 |
|
511 |
# 3) Deploy demo Space
|
512 |
if deploy_demo:
|
@@ -522,8 +537,11 @@ def start_voxtral_training(
|
|
522 |
"--space-name", demo_space_name,
|
523 |
]
|
524 |
all_logs.append("🚀 Deploying demo Space...")
|
525 |
-
|
526 |
-
|
|
|
|
|
|
|
527 |
|
528 |
# Return all collected logs as a single string
|
529 |
return "\n".join(all_logs)
|
|
|
460 |
# Collect all logs
|
461 |
all_logs = []
|
462 |
|
463 |
+
def collect_logs_with_code(generator):
|
464 |
+
"""Collect logs and parse the exit code from the final status line."""
|
465 |
+
import re
|
466 |
+
exit_code = None
|
467 |
for line in generator:
|
468 |
all_logs.append(line)
|
469 |
+
print(line)
|
470 |
+
m = re.search(r"exit code:\s*(\d+)", line)
|
471 |
+
if m:
|
472 |
+
try:
|
473 |
+
exit_code = int(m.group(1))
|
474 |
+
except Exception:
|
475 |
+
pass
|
476 |
+
return 0 if exit_code == 0 else (exit_code if exit_code is not None else 1)
|
477 |
|
478 |
try:
|
479 |
# 1) Train
|
|
|
502 |
args += ["--freeze-audio-tower"]
|
503 |
|
504 |
all_logs.append("🚀 Starting Voxtral training...")
|
505 |
+
train_code = collect_logs_with_code(run_command_stream(args, env))
|
506 |
+
if train_code != 0:
|
507 |
+
all_logs.append("❌ Training failed. Skipping model push and demo deployment.")
|
508 |
+
return "\n".join(all_logs)
|
509 |
all_logs.append("✅ Training completed!")
|
510 |
|
511 |
# 2) Push to Hub
|
|
|
517 |
full_repo_name,
|
518 |
]
|
519 |
all_logs.append(f"📤 Pushing model to Hugging Face Hub: {full_repo_name}")
|
520 |
+
push_code = collect_logs_with_code(run_command_stream(push_args, env))
|
521 |
+
if push_code != 0:
|
522 |
+
all_logs.append("❌ Model push failed.")
|
523 |
+
else:
|
524 |
+
all_logs.append("✅ Model pushed successfully!")
|
525 |
|
526 |
# 3) Deploy demo Space
|
527 |
if deploy_demo:
|
|
|
537 |
"--space-name", demo_space_name,
|
538 |
]
|
539 |
all_logs.append("🚀 Deploying demo Space...")
|
540 |
+
deploy_code = collect_logs_with_code(run_command_stream(deploy_args, env))
|
541 |
+
if deploy_code != 0:
|
542 |
+
all_logs.append("❌ Demo Space deployment failed.")
|
543 |
+
else:
|
544 |
+
all_logs.append("✅ Demo Space deployed!")
|
545 |
|
546 |
# Return all collected logs as a single string
|
547 |
return "\n".join(all_logs)
|
scripts/deploy_demo_space.py
CHANGED
@@ -189,36 +189,37 @@ class DemoSpaceDeployer:
|
|
189 |
# For GPT-OSS models, we need more sophisticated environment setup
|
190 |
model_name = self.model_id.split("/")[-1] if "/" in self.model_id else self.model_id
|
191 |
import json as _json
|
192 |
-
|
193 |
-
|
|
|
|
|
|
|
194 |
import os
|
195 |
-
|
196 |
-
os.environ['
|
|
|
197 |
os.environ['BASE_MODEL_ID'] = 'openai/gpt-oss-20b'
|
198 |
-
os.environ['MODEL_SUBFOLDER'] = json.dumps(self.subfolder if self.subfolder else "")
|
199 |
-
os.environ['MODEL_NAME'] = json.dumps(model_name)
|
200 |
-
os.environ['MODEL_IDENTITY'] = json.dumps(self.model_identity or "")
|
201 |
-
os.environ['SYSTEM_MESSAGE'] = json.dumps(self.system_message or (self.model_identity or ""))
|
202 |
-
os.environ['DEVELOPER_MESSAGE'] = json.dumps(self.developer_message or "")
|
203 |
-
os.environ['REASONING_EFFORT'] = json.dumps((self.reasoning_effort or "medium"))
|
204 |
-
{
|
205 |
-
{"os.environ['DISABLE_EXAMPLES'] = 'true'\n" if self.disable_examples else ("os.environ['DISABLE_EXAMPLES'] = 'false'\n" if self.disable_examples is not None else '')}
|
206 |
-
{"os.environ['EXAMPLES_JSON'] = " + _json.dumps(self.examples_json) + "\n" if self.examples_json else ''}
|
207 |
|
208 |
# Branding/owner variables
|
209 |
-
os.environ['HF_USERNAME'] = json.dumps(self.hf_username)
|
210 |
-
os.environ['BRAND_OWNER_NAME'] = json.dumps(self.brand_owner_name)
|
211 |
-
os.environ['BRAND_TEAM_NAME'] = json.dumps(self.brand_team_name)
|
212 |
-
os.environ['BRAND_DISCORD_URL'] = json.dumps(self.brand_discord_url)
|
213 |
-
os.environ['BRAND_HF_ORG'] = json.dumps(self.brand_hf_org)
|
214 |
-
os.environ['BRAND_HF_LABEL'] = json.dumps(self.brand_hf_label)
|
215 |
-
os.environ['BRAND_HF_URL'] = json.dumps(self.brand_hf_url)
|
216 |
-
os.environ['BRAND_GH_ORG'] = json.dumps(self.brand_gh_org)
|
217 |
-
os.environ['BRAND_GH_LABEL'] = json.dumps(self.brand_gh_label)
|
218 |
-
os.environ['BRAND_GH_URL'] = json.dumps(self.brand_gh_url)
|
219 |
-
os.environ['BRAND_PROJECT_NAME'] = json.dumps(self.brand_project_name)
|
220 |
-
os.environ['BRAND_PROJECT_URL'] = json.dumps(self.brand_project_url)
|
221 |
-
|
222 |
"""
|
223 |
elif self.demo_type == "voxtral":
|
224 |
# For Voxtral, we do not inject env setup into app.py.
|
@@ -227,34 +228,35 @@ os.environ['BRAND_PROJECT_URL'] = json.dumps(self.brand_project_url)
|
|
227 |
else:
|
228 |
# For SmolLM models, use simpler setup
|
229 |
import json as _json
|
230 |
-
|
231 |
-
|
|
|
|
|
|
|
232 |
import os
|
233 |
-
|
234 |
-
os.environ['
|
235 |
-
os.environ['
|
236 |
-
os.environ['
|
237 |
-
os.environ['
|
238 |
-
os.environ['
|
239 |
-
os.environ['
|
240 |
-
|
241 |
-
{
|
242 |
-
{"os.environ['EXAMPLES_JSON'] = " + _json.dumps(self.examples_json) + "\n" if self.examples_json else ''}
|
243 |
|
244 |
# Branding/owner variables
|
245 |
-
os.environ['HF_USERNAME'] = json.dumps(self.hf_username)
|
246 |
-
os.environ['BRAND_OWNER_NAME'] = json.dumps(self.brand_owner_name)
|
247 |
-
os.environ['BRAND_TEAM_NAME'] = json.dumps(self.brand_team_name)
|
248 |
-
os.environ['BRAND_DISCORD_URL'] = json.dumps(self.brand_discord_url)
|
249 |
-
os.environ['BRAND_HF_ORG'] = json.dumps(self.brand_hf_org)
|
250 |
-
os.environ['BRAND_HF_LABEL'] = json.dumps(self.brand_hf_label)
|
251 |
-
os.environ['BRAND_HF_URL'] = json.dumps(self.brand_hf_url)
|
252 |
-
os.environ['BRAND_GH_ORG'] = json.dumps(self.brand_gh_org)
|
253 |
-
os.environ['BRAND_GH_LABEL'] = json.dumps(self.brand_gh_label)
|
254 |
-
os.environ['BRAND_GH_URL'] = json.dumps(self.brand_gh_url)
|
255 |
-
os.environ['BRAND_PROJECT_NAME'] = json.dumps(self.brand_project_name)
|
256 |
-
os.environ['BRAND_PROJECT_URL'] = json.dumps(self.brand_project_url)
|
257 |
-
|
258 |
"""
|
259 |
return env_setup
|
260 |
|
|
|
189 |
# For GPT-OSS models, we need more sophisticated environment setup
|
190 |
model_name = self.model_id.split("/")[-1] if "/" in self.model_id else self.model_id
|
191 |
import json as _json
|
192 |
+
ex_type_line = f"os.environ['EXAMPLES_TYPE'] = {_json.dumps(self.examples_type)}\n" if self.examples_type else ""
|
193 |
+
disable_line = ("os.environ['DISABLE_EXAMPLES'] = 'true'\n" if self.disable_examples
|
194 |
+
else ("os.environ['DISABLE_EXAMPLES'] = 'false'\n" if self.disable_examples is not None else ""))
|
195 |
+
examples_json_line = f"os.environ['EXAMPLES_JSON'] = {_json.dumps(self.examples_json)}\n" if self.examples_json else ""
|
196 |
+
env_setup = f"""# Environment variables for GPT-OSS model configuration
|
197 |
import os
|
198 |
+
import json
|
199 |
+
os.environ['HF_MODEL_ID'] = json.dumps({_json.dumps(self.model_id)})
|
200 |
+
os.environ['LORA_MODEL_ID'] = json.dumps({_json.dumps(self.model_id)})
|
201 |
os.environ['BASE_MODEL_ID'] = 'openai/gpt-oss-20b'
|
202 |
+
os.environ['MODEL_SUBFOLDER'] = json.dumps({_json.dumps(self.subfolder if self.subfolder else "")})
|
203 |
+
os.environ['MODEL_NAME'] = json.dumps({_json.dumps(model_name)})
|
204 |
+
os.environ['MODEL_IDENTITY'] = json.dumps({_json.dumps(self.model_identity or "")})
|
205 |
+
os.environ['SYSTEM_MESSAGE'] = json.dumps({_json.dumps(self.system_message or (self.model_identity or ""))})
|
206 |
+
os.environ['DEVELOPER_MESSAGE'] = json.dumps({_json.dumps(self.developer_message or "")})
|
207 |
+
os.environ['REASONING_EFFORT'] = json.dumps({_json.dumps((self.reasoning_effort or "medium"))})
|
208 |
+
{ex_type_line}{disable_line}{examples_json_line}
|
|
|
|
|
209 |
|
210 |
# Branding/owner variables
|
211 |
+
os.environ['HF_USERNAME'] = json.dumps({_json.dumps(self.hf_username)})
|
212 |
+
os.environ['BRAND_OWNER_NAME'] = json.dumps({_json.dumps(self.brand_owner_name)})
|
213 |
+
os.environ['BRAND_TEAM_NAME'] = json.dumps({_json.dumps(self.brand_team_name)})
|
214 |
+
os.environ['BRAND_DISCORD_URL'] = json.dumps({_json.dumps(self.brand_discord_url)})
|
215 |
+
os.environ['BRAND_HF_ORG'] = json.dumps({_json.dumps(self.brand_hf_org)})
|
216 |
+
os.environ['BRAND_HF_LABEL'] = json.dumps({_json.dumps(self.brand_hf_label)})
|
217 |
+
os.environ['BRAND_HF_URL'] = json.dumps({_json.dumps(self.brand_hf_url)})
|
218 |
+
os.environ['BRAND_GH_ORG'] = json.dumps({_json.dumps(self.brand_gh_org)})
|
219 |
+
os.environ['BRAND_GH_LABEL'] = json.dumps({_json.dumps(self.brand_gh_label)})
|
220 |
+
os.environ['BRAND_GH_URL'] = json.dumps({_json.dumps(self.brand_gh_url)})
|
221 |
+
os.environ['BRAND_PROJECT_NAME'] = json.dumps({_json.dumps(self.brand_project_name)})
|
222 |
+
os.environ['BRAND_PROJECT_URL'] = json.dumps({_json.dumps(self.brand_project_url)})
|
|
|
223 |
"""
|
224 |
elif self.demo_type == "voxtral":
|
225 |
# For Voxtral, we do not inject env setup into app.py.
|
|
|
228 |
else:
|
229 |
# For SmolLM models, use simpler setup
|
230 |
import json as _json
|
231 |
+
ex_type_line = f"os.environ['EXAMPLES_TYPE'] = {_json.dumps(self.examples_type)}\n" if self.examples_type else ""
|
232 |
+
disable_line = ("os.environ['DISABLE_EXAMPLES'] = 'true'\n" if self.disable_examples
|
233 |
+
else ("os.environ['DISABLE_EXAMPLES'] = 'false'\n" if self.disable_examples is not None else ""))
|
234 |
+
examples_json_line = f"os.environ['EXAMPLES_JSON'] = {_json.dumps(self.examples_json)}\n" if self.examples_json else ""
|
235 |
+
env_setup = f"""# Environment variables for model configuration
|
236 |
import os
|
237 |
+
import json
|
238 |
+
os.environ['HF_MODEL_ID'] = json.dumps({_json.dumps(self.model_id)})
|
239 |
+
os.environ['MODEL_SUBFOLDER'] = json.dumps({_json.dumps(self.subfolder if self.subfolder else "")})
|
240 |
+
os.environ['MODEL_NAME'] = json.dumps({_json.dumps(self.model_id.split("/")[-1])})
|
241 |
+
os.environ['MODEL_IDENTITY'] = json.dumps({_json.dumps(self.model_identity or "")})
|
242 |
+
os.environ['SYSTEM_MESSAGE'] = json.dumps({_json.dumps(self.system_message or (self.model_identity or ""))})
|
243 |
+
os.environ['DEVELOPER_MESSAGE'] = json.dumps({_json.dumps(self.developer_message or "")})
|
244 |
+
os.environ['REASONING_EFFORT'] = json.dumps({_json.dumps((self.reasoning_effort or "medium"))})
|
245 |
+
{ex_type_line}{disable_line}{examples_json_line}
|
|
|
246 |
|
247 |
# Branding/owner variables
|
248 |
+
os.environ['HF_USERNAME'] = json.dumps({_json.dumps(self.hf_username)})
|
249 |
+
os.environ['BRAND_OWNER_NAME'] = json.dumps({_json.dumps(self.brand_owner_name)})
|
250 |
+
os.environ['BRAND_TEAM_NAME'] = json.dumps({_json.dumps(self.brand_team_name)})
|
251 |
+
os.environ['BRAND_DISCORD_URL'] = json.dumps({_json.dumps(self.brand_discord_url)})
|
252 |
+
os.environ['BRAND_HF_ORG'] = json.dumps({_json.dumps(self.brand_hf_org)})
|
253 |
+
os.environ['BRAND_HF_LABEL'] = json.dumps({_json.dumps(self.brand_hf_label)})
|
254 |
+
os.environ['BRAND_HF_URL'] = json.dumps({_json.dumps(self.brand_hf_url)})
|
255 |
+
os.environ['BRAND_GH_ORG'] = json.dumps({_json.dumps(self.brand_gh_org)})
|
256 |
+
os.environ['BRAND_GH_LABEL'] = json.dumps({_json.dumps(self.brand_gh_label)})
|
257 |
+
os.environ['BRAND_GH_URL'] = json.dumps({_json.dumps(self.brand_gh_url)})
|
258 |
+
os.environ['BRAND_PROJECT_NAME'] = json.dumps({_json.dumps(self.brand_project_name)})
|
259 |
+
os.environ['BRAND_PROJECT_URL'] = json.dumps({_json.dumps(self.brand_project_url)})
|
|
|
260 |
"""
|
261 |
return env_setup
|
262 |
|
scripts/train.py
CHANGED
@@ -376,11 +376,9 @@ def main():
|
|
376 |
|
377 |
data_collator = VoxtralDataCollator(processor, model_checkpoint)
|
378 |
|
379 |
-
#
|
380 |
report_to = []
|
381 |
-
|
382 |
-
report_to = ["trackio"]
|
383 |
-
|
384 |
training_args = TrainingArguments(
|
385 |
output_dir=output_dir,
|
386 |
per_device_train_batch_size=args.batch_size,
|
|
|
376 |
|
377 |
data_collator = VoxtralDataCollator(processor, model_checkpoint)
|
378 |
|
379 |
+
# Disable Transformers Trackio callback to avoid httpx timeouts; logging is handled via trackio.init()
|
380 |
report_to = []
|
381 |
+
|
|
|
|
|
382 |
training_args = TrainingArguments(
|
383 |
output_dir=output_dir,
|
384 |
per_device_train_batch_size=args.batch_size,
|
scripts/train_lora.py
CHANGED
@@ -405,11 +405,9 @@ def main():
|
|
405 |
|
406 |
data_collator = VoxtralDataCollator(processor, model_checkpoint)
|
407 |
|
408 |
-
#
|
409 |
report_to = []
|
410 |
-
|
411 |
-
report_to = ["trackio"]
|
412 |
-
|
413 |
training_args = TrainingArguments(
|
414 |
output_dir=output_dir,
|
415 |
per_device_train_batch_size=args.batch_size,
|
|
|
405 |
|
406 |
data_collator = VoxtralDataCollator(processor, model_checkpoint)
|
407 |
|
408 |
+
# Disable Transformers Trackio callback to avoid httpx timeouts; logging is handled via trackio.init()
|
409 |
report_to = []
|
410 |
+
|
|
|
|
|
411 |
training_args = TrainingArguments(
|
412 |
output_dir=output_dir,
|
413 |
per_device_train_batch_size=args.batch_size,
|