File size: 3,437 Bytes
7c29612
 
 
 
 
 
 
9907307
 
 
bb0d65c
9907307
 
bb0d65c
9907307
 
 
7c29612
 
 
 
 
 
 
 
 
 
 
9907307
 
 
 
 
7c29612
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import os
import random
import numpy as np
import torch
import gradio as gr
from diffusers import StableDiffusionPipeline
import paramiko
from huggingface_hub import login

# Hugging Face Token
HF_TOKEN = os.getenv('HF_TOKEN', '').strip()

if not HF_TOKEN:
    raise ValueError("HUGGING_TOKEN is not set. Please set the token as an environment variable.")

# Hugging Face Login
login(token=HF_TOKEN)

# Konfiguration
STORAGE_DOMAIN = os.getenv('STORAGE_DOMAIN', '').strip()  # SFTP Server Domain
STORAGE_USER = os.getenv('STORAGE_USER', '').strip()      # SFTP User
STORAGE_PSWD = os.getenv('STORAGE_PSWD', '').strip()      # SFTP Passwort
STORAGE_PORT = int(os.getenv('STORAGE_PORT', '22').strip())  # SFTP Port
STORAGE_SECRET = os.getenv('STORAGE_SECRET', '').strip()  # Secret Token

# Modell laden
device = "cuda" if torch.cuda.is_available() else "cpu"
repo = "stabilityai/stable-diffusion-3-medium-diffusers"

try:
    pipe = StableDiffusionPipeline.from_pretrained(repo, torch_dtype=torch.float16).to(device)
except Exception as e:
    raise RuntimeError(f"Failed to load the model. Ensure the token has access to the repo. Error: {e}")

# Maximalwerte
MAX_SEED = np.iinfo(np.int32).max
MAX_IMAGE_SIZE = 1344

# SFTP-Funktion
def upload_to_sftp(local_file, remote_path):
    try:
        transport = paramiko.Transport((STORAGE_DOMAIN, STORAGE_PORT))
        transport.connect(username=STORAGE_USER, password=STORAGE_PSWD)
        sftp = paramiko.SFTPClient.from_transport(transport)
        sftp.put(local_file, remote_path)
        sftp.close()
        transport.close()
        print(f"File {local_file} successfully uploaded to {remote_path}")
        return True
    except Exception as e:
        print(f"Error during SFTP upload: {e}")
        return False

# Inferenz-Funktion
def infer(prompt, width, height, guidance_scale, num_inference_steps, seed, randomize_seed):
    if randomize_seed:
        seed = random.randint(0, MAX_SEED)
    
    generator = torch.manual_seed(seed)
    image = pipe(prompt, guidance_scale=guidance_scale, num_inference_steps=num_inference_steps, width=width, height=height, generator=generator).images[0]
    
    # Speichere Bild lokal
    local_file = f"/tmp/generated_image_{seed}.png"
    image.save(local_file)
    
    # Hochladen zu SFTP
    remote_path = f"/uploads/generated_image_{seed}.png"
    if upload_to_sftp(local_file, remote_path):
        os.remove(local_file)
        return f"Image uploaded to {remote_path}", seed
    else:
        return "Failed to upload image", seed

# Gradio-App
with gr.Blocks() as demo:
    gr.Markdown("### Stable Diffusion 3 - Test App")
    prompt = gr.Textbox(label="Prompt", placeholder="Enter your prompt here")
    width = gr.Slider(256, MAX_IMAGE_SIZE, step=64, value=512, label="Width")
    height = gr.Slider(256, MAX_IMAGE_SIZE, step=64, value=512, label="Height")
    guidance_scale = gr.Slider(0.0, 10.0, step=0.1, value=7.5, label="Guidance Scale")
    num_inference_steps = gr.Slider(1, 50, step=1, value=25, label="Inference Steps")
    seed = gr.Number(value=42, label="Seed")
    randomize_seed = gr.Checkbox(value=False, label="Randomize Seed")
    generate_button = gr.Button("Generate Image")
    output = gr.Text(label="Output")

    generate_button.click(
        infer,
        inputs=[prompt, width, height, guidance_scale, num_inference_steps, seed, randomize_seed],
        outputs=[output, seed]
    )

demo.launch()