Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -4,6 +4,7 @@ from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
| 4 |
import tempfile
|
| 5 |
import os
|
| 6 |
import hashlib
|
|
|
|
| 7 |
from gradio import Progress
|
| 8 |
|
| 9 |
# Function to get OID from a raw Hugging Face LFS file URL
|
|
@@ -193,19 +194,73 @@ def download_file(url, dest):
|
|
| 193 |
except Exception as e:
|
| 194 |
return False, str(e)
|
| 195 |
|
| 196 |
-
def download_file_with_progress(url, dest, progress: Progress = None):
|
| 197 |
try:
|
| 198 |
r = requests.get(url, stream=True, timeout=30)
|
| 199 |
r.raise_for_status()
|
| 200 |
total = int(r.headers.get('content-length', 0))
|
| 201 |
downloaded = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 202 |
with open(dest, 'wb') as f:
|
| 203 |
-
for chunk in r.iter_content(chunk_size=
|
| 204 |
if chunk:
|
| 205 |
f.write(chunk)
|
| 206 |
downloaded += len(chunk)
|
| 207 |
-
|
| 208 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 209 |
return True, ""
|
| 210 |
except Exception as e:
|
| 211 |
return False, str(e)
|
|
@@ -321,31 +376,43 @@ with gr.Blocks(theme="soft") as demo:
|
|
| 321 |
if not m1 or not m2 or not fname:
|
| 322 |
return "Please provide both model IDs and the file name."
|
| 323 |
|
| 324 |
-
progress(0, desc="
|
| 325 |
|
| 326 |
url1 = f"https://huggingface.co/{m1}/resolve/main/{fname}?download=true"
|
| 327 |
url2 = f"https://huggingface.co/{m2}/resolve/main/{fname}?download=true"
|
| 328 |
|
| 329 |
with tempfile.TemporaryDirectory() as tmp:
|
| 330 |
-
f1 = os.path.join(tmp, "
|
| 331 |
-
f2 = os.path.join(tmp, "
|
|
|
|
|
|
|
|
|
|
|
|
|
| 332 |
|
| 333 |
-
|
| 334 |
-
|
| 335 |
|
| 336 |
-
|
| 337 |
-
|
|
|
|
| 338 |
|
| 339 |
-
if not
|
| 340 |
-
return f"Download error
|
| 341 |
|
| 342 |
-
|
|
|
|
| 343 |
percent, err = file_similarity(f1, f2)
|
| 344 |
if err:
|
| 345 |
return f"Comparison error: {err}"
|
| 346 |
|
| 347 |
-
progress(1.0, desc="
|
| 348 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 349 |
adv_btn.click(
|
| 350 |
fn=adv_compare,
|
| 351 |
inputs=[adv_model1, adv_model2, adv_filename],
|
|
|
|
| 4 |
import tempfile
|
| 5 |
import os
|
| 6 |
import hashlib
|
| 7 |
+
import time
|
| 8 |
from gradio import Progress
|
| 9 |
|
| 10 |
# Function to get OID from a raw Hugging Face LFS file URL
|
|
|
|
| 194 |
except Exception as e:
|
| 195 |
return False, str(e)
|
| 196 |
|
| 197 |
+
def download_file_with_progress(url, dest, progress: Progress = None, progress_offset=0, progress_scale=1):
|
| 198 |
try:
|
| 199 |
r = requests.get(url, stream=True, timeout=30)
|
| 200 |
r.raise_for_status()
|
| 201 |
total = int(r.headers.get('content-length', 0))
|
| 202 |
downloaded = 0
|
| 203 |
+
start_time = time.time()
|
| 204 |
+
last_update_time = start_time
|
| 205 |
+
|
| 206 |
+
if progress and total:
|
| 207 |
+
progress(progress_offset, desc=f"Starting download: {os.path.basename(dest)} ({total//1024//1024}MB)")
|
| 208 |
+
|
| 209 |
with open(dest, 'wb') as f:
|
| 210 |
+
for chunk in r.iter_content(chunk_size=32768): # Larger chunks for better performance
|
| 211 |
if chunk:
|
| 212 |
f.write(chunk)
|
| 213 |
downloaded += len(chunk)
|
| 214 |
+
current_time = time.time()
|
| 215 |
+
|
| 216 |
+
# Update progress every 0.5 seconds to avoid too frequent updates
|
| 217 |
+
if progress and total and (current_time - last_update_time) >= 0.5:
|
| 218 |
+
# Calculate progress within the allocated range
|
| 219 |
+
file_progress = downloaded / total
|
| 220 |
+
overall_progress = progress_offset + (file_progress * progress_scale)
|
| 221 |
+
|
| 222 |
+
# Calculate download speed
|
| 223 |
+
elapsed_time = current_time - start_time
|
| 224 |
+
if elapsed_time > 0:
|
| 225 |
+
speed_bps = downloaded / elapsed_time
|
| 226 |
+
speed_mbps = speed_bps / (1024 * 1024)
|
| 227 |
+
|
| 228 |
+
# Format speed appropriately
|
| 229 |
+
if speed_mbps >= 1:
|
| 230 |
+
speed_str = f"{speed_mbps:.1f} MB/s"
|
| 231 |
+
else:
|
| 232 |
+
speed_kbps = speed_bps / 1024
|
| 233 |
+
speed_str = f"{speed_kbps:.1f} KB/s"
|
| 234 |
+
else:
|
| 235 |
+
speed_str = "-- MB/s"
|
| 236 |
+
|
| 237 |
+
# Calculate ETA
|
| 238 |
+
if speed_bps > 0:
|
| 239 |
+
remaining_bytes = total - downloaded
|
| 240 |
+
eta_seconds = remaining_bytes / speed_bps
|
| 241 |
+
if eta_seconds < 60:
|
| 242 |
+
eta_str = f"{eta_seconds:.0f}s"
|
| 243 |
+
else:
|
| 244 |
+
eta_minutes = eta_seconds / 60
|
| 245 |
+
eta_str = f"{eta_minutes:.1f}m"
|
| 246 |
+
else:
|
| 247 |
+
eta_str = "--"
|
| 248 |
+
|
| 249 |
+
mb_downloaded = downloaded // 1024 // 1024
|
| 250 |
+
mb_total = total // 1024 // 1024
|
| 251 |
+
|
| 252 |
+
progress(overall_progress,
|
| 253 |
+
desc=f"📥 {os.path.basename(dest)}: {mb_downloaded}MB/{mb_total}MB ({file_progress*100:.1f}%) | 🚀 {speed_str} | ⏱️ ETA: {eta_str}")
|
| 254 |
+
|
| 255 |
+
last_update_time = current_time
|
| 256 |
+
|
| 257 |
+
if progress:
|
| 258 |
+
final_time = time.time()
|
| 259 |
+
total_time = final_time - start_time
|
| 260 |
+
avg_speed = (downloaded / total_time) / (1024 * 1024) if total_time > 0 else 0
|
| 261 |
+
progress(progress_offset + progress_scale,
|
| 262 |
+
desc=f"✅ Downloaded {os.path.basename(dest)} | {total//1024//1024}MB | Avg: {avg_speed:.1f} MB/s")
|
| 263 |
+
|
| 264 |
return True, ""
|
| 265 |
except Exception as e:
|
| 266 |
return False, str(e)
|
|
|
|
| 376 |
if not m1 or not m2 or not fname:
|
| 377 |
return "Please provide both model IDs and the file name."
|
| 378 |
|
| 379 |
+
progress(0, desc="Initializing...")
|
| 380 |
|
| 381 |
url1 = f"https://huggingface.co/{m1}/resolve/main/{fname}?download=true"
|
| 382 |
url2 = f"https://huggingface.co/{m2}/resolve/main/{fname}?download=true"
|
| 383 |
|
| 384 |
with tempfile.TemporaryDirectory() as tmp:
|
| 385 |
+
f1 = os.path.join(tmp, f"model1_{fname}")
|
| 386 |
+
f2 = os.path.join(tmp, f"model2_{fname}")
|
| 387 |
+
|
| 388 |
+
# Download first file (0% to 45%)
|
| 389 |
+
progress(0.05, desc=f"Starting download from {m1.split('/')[-1]}...")
|
| 390 |
+
ok1, err1 = download_file_with_progress(url1, f1, progress, progress_offset=0.05, progress_scale=0.4)
|
| 391 |
|
| 392 |
+
if not ok1:
|
| 393 |
+
return f"Download error from {m1}: {err1}"
|
| 394 |
|
| 395 |
+
# Download second file (45% to 90%)
|
| 396 |
+
progress(0.5, desc=f"Starting download from {m2.split('/')[-1]}...")
|
| 397 |
+
ok2, err2 = download_file_with_progress(url2, f2, progress, progress_offset=0.5, progress_scale=0.4)
|
| 398 |
|
| 399 |
+
if not ok2:
|
| 400 |
+
return f"Download error from {m2}: {err2}"
|
| 401 |
|
| 402 |
+
# Compare files (90% to 100%)
|
| 403 |
+
progress(0.9, desc="Comparing files byte-by-byte...")
|
| 404 |
percent, err = file_similarity(f1, f2)
|
| 405 |
if err:
|
| 406 |
return f"Comparison error: {err}"
|
| 407 |
|
| 408 |
+
progress(1.0, desc="Comparison complete! ✓")
|
| 409 |
+
|
| 410 |
+
# Format file sizes for display
|
| 411 |
+
size1 = os.path.getsize(f1)
|
| 412 |
+
size2 = os.path.getsize(f2)
|
| 413 |
+
size_mb = size1 // 1024 // 1024
|
| 414 |
+
|
| 415 |
+
return f"Similarity: {percent:.2f}% ({'✅ IDENTICAL' if percent==100 else '❌ DIFFERENT'}) | File size: {size_mb}MB"
|
| 416 |
adv_btn.click(
|
| 417 |
fn=adv_compare,
|
| 418 |
inputs=[adv_model1, adv_model2, adv_filename],
|