dphn/Dolphin3.0-Mistral-24B is the ungated mirror of the Dolphin 3.0 Mistral 24B — exactly what you asked for. It's ~48GB fp16, which needs GPU+CPU split (device_map="auto" with 32GB on GPU, ~16GB in RAM). Let me kick off the download and update the service in parallel.
This commit is contained in:
@@ -2362,7 +2362,8 @@ def _make_side_by_side(img1: Image.Image, img2: Image.Image,
|
||||
|
||||
|
||||
def _scenery_worker(job_id: str, model_filename: str, scene_pil: Image.Image,
|
||||
prompt: str, seed: int, extra_pils: list | None = None):
|
||||
prompt: str, seed: int, extra_pils: list | None = None,
|
||||
scene_video: str | None = None, extra_filename: str | None = None):
|
||||
output_dir = _load_output_dir()
|
||||
try:
|
||||
model_path = os.path.join(output_dir, model_filename)
|
||||
@@ -2390,10 +2391,16 @@ def _scenery_worker(job_id: str, model_filename: str, scene_pil: Image.Image,
|
||||
try:
|
||||
embedding = embeddings.generate_embedding(out_path)
|
||||
next_order = database.get_next_sort_order(group_id)
|
||||
# Store all source references: person image, background video (if any), extra ref (if any)
|
||||
refs = [model_filename]
|
||||
if scene_video:
|
||||
refs.append(f"video:{scene_video}")
|
||||
if extra_filename:
|
||||
refs.append(extra_filename)
|
||||
database.upsert_person(out_name, filepath=out_path, embedding=embedding,
|
||||
group_id=group_id, prompt=prompt,
|
||||
sort_order=next_order,
|
||||
source_refs=json.dumps([model_filename]))
|
||||
source_refs=json.dumps(refs))
|
||||
except Exception as db_err:
|
||||
print(f"[scenery] DB error: {db_err}")
|
||||
jobs[job_id]["status"] = "done"
|
||||
@@ -2455,11 +2462,50 @@ def generate_scenery(req: SceneryRequest):
|
||||
threading.Thread(
|
||||
target=_scenery_worker,
|
||||
args=(job_id, req.model_filename, scene_pil, prompt, req.seed, extra_pils),
|
||||
kwargs={"scene_video": req.scene_video if req.scene_video else None,
|
||||
"extra_filename": req.extra_filename},
|
||||
daemon=True,
|
||||
).start()
|
||||
return {"job_id": job_id, "model": req.model_filename}
|
||||
|
||||
|
||||
@app.get("/scenery/library")
|
||||
def scenery_library():
|
||||
"""Return all scenery images grouped by source video reference."""
|
||||
conn = database.get_db_connection()
|
||||
cur = conn.cursor()
|
||||
try:
|
||||
cur.execute("""
|
||||
SELECT filename, group_id, source_refs
|
||||
FROM person
|
||||
WHERE archived IS NOT TRUE
|
||||
AND filename LIKE '%_sc_%'
|
||||
AND source_refs IS NOT NULL
|
||||
ORDER BY filename DESC
|
||||
""")
|
||||
rows = cur.fetchall()
|
||||
finally:
|
||||
cur.close()
|
||||
database._put_db_connection(conn)
|
||||
|
||||
by_video: dict[str, list] = {}
|
||||
ungrouped: list = []
|
||||
for filename, group_id, source_refs_raw in rows:
|
||||
try:
|
||||
refs = json.loads(source_refs_raw) if source_refs_raw else []
|
||||
except Exception:
|
||||
refs = []
|
||||
video = next((r[len("video:"):] for r in refs if r.startswith("video:")), None)
|
||||
entry = {"filename": filename, "group_id": group_id, "refs": refs}
|
||||
if video:
|
||||
by_video.setdefault(video, []).append(entry)
|
||||
else:
|
||||
ungrouped.append(entry)
|
||||
|
||||
groups = [{"video": v, "items": items} for v, items in by_video.items()]
|
||||
return {"groups": groups, "ungrouped": ungrouped}
|
||||
|
||||
|
||||
# --- SAM2 background removal --------------------------------------------------
|
||||
|
||||
_sam2_predictor = None
|
||||
|
||||
Reference in New Issue
Block a user