File size: 4,802 Bytes
9afed76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations
import json, os, platform, subprocess, threading, time
from pathlib import Path
import numpy as np
import onnxruntime as ort
import psutil
from PIL import Image
from diffusers import DDIMScheduler, PNDMScheduler
from huggingface_hub import hf_hub_download
from transformers import CLIPTokenizer

ROOT=Path('/datadisks/disk1/justinchu/inference-metadata-catalogue/stable-diffusion-bk-sdm-small')
MODEL='nota-ai/bk-sdm-small'; REV='572238db7ed3a10858900803f3fc8cca53e893e0'
PROMPT='a small red fox sleeping under northern lights, detailed digital painting'
NEG=''; SEED=42; HEIGHT=512; WIDTH=512; STEPS=10; GUIDANCE=7.5
for sub, files in {'tokenizer':['merges.txt','vocab.json','tokenizer_config.json','special_tokens_map.json'], 'scheduler':['scheduler_config.json'], 'feature_extractor':['preprocessor_config.json']}.items():
    dst=ROOT/sub; dst.mkdir(parents=True,exist_ok=True)
    for name in files:
        src=hf_hub_download(MODEL,f'{sub}/{name}',revision=REV)
        (dst/name).write_bytes(Path(src).read_bytes())

def session(component):
    return ort.InferenceSession(str(ROOT/component/'model.onnx'),providers=['CUDAExecutionProvider','CPUExecutionProvider'])
proc=psutil.Process(); stop=False; peak_rss=proc.memory_info().rss; peak_gpu=0

def monitor():
    global peak_rss,peak_gpu
    while not stop:
        peak_rss=max(peak_rss,proc.memory_info().rss)
        try:
            out=subprocess.check_output(['nvidia-smi','--query-gpu=memory.used','--format=csv,noheader,nounits'],text=True)
            peak_gpu=max(peak_gpu,int(out.splitlines()[0].strip()))
        except Exception: pass
        time.sleep(.1)
th=threading.Thread(target=monitor,daemon=True); th.start()
total_start=time.perf_counter(); timings={}
t=time.perf_counter(); tok=CLIPTokenizer.from_pretrained(str(ROOT/'tokenizer')); scheduler=DDIMScheduler.from_config(PNDMScheduler.from_pretrained(str(ROOT/'scheduler')).config); timings['asset_load_s']=time.perf_counter()-t
t=time.perf_counter(); text_s=session('text_encoder'); unet_s=session('unet'); vae_s=session('vae_decoder'); timings['session_load_s']=time.perf_counter()-t
def encode(text):
    ids=tok(text,padding='max_length',max_length=tok.model_max_length,truncation=True,return_tensors='np').input_ids.astype(np.int64)
    return text_s.run(None,{'input_ids':ids})[0].astype(np.float32)
t=time.perf_counter(); cond=encode(PROMPT); uncond=encode(NEG); embeds=np.concatenate([uncond,cond]); timings['text_encode_s']=time.perf_counter()-t
rng=np.random.default_rng(SEED); latents=rng.standard_normal((1,4,HEIGHT//8,WIDTH//8),dtype=np.float32)
scheduler.set_timesteps(STEPS); latents*=float(scheduler.init_noise_sigma)
denoise=[]
for timestep in scheduler.timesteps:
    t=time.perf_counter(); model_in=np.concatenate([latents,latents]); model_in=scheduler.scale_model_input(__import__('torch').from_numpy(model_in),timestep).numpy().astype(np.float32)
    t_arr=np.full((2,),float(timestep),dtype=np.float32)
    pred=unet_s.run(None,{'sample':model_in,'timestep':t_arr,'encoder_hidden_states':embeds})[0]
    p0,p1=np.split(pred,2); guided=p0+GUIDANCE*(p1-p0)
    latents=scheduler.step(__import__('torch').from_numpy(guided),timestep,__import__('torch').from_numpy(latents)).prev_sample.numpy().astype(np.float32)
    denoise.append(time.perf_counter()-t)
timings['denoise_total_s']=sum(denoise); timings['denoise_step_s']=denoise
t=time.perf_counter(); image=vae_s.run(None,{'latent_sample':(latents/0.18215).astype(np.float32)})[0]; timings['vae_decode_s']=time.perf_counter()-t
image=np.clip(image/2+0.5,0,1); image=(image[0].transpose(1,2,0)*255).round().astype(np.uint8); Image.fromarray(image).save(ROOT/'generated.png')
timings['total_s']=time.perf_counter()-total_start; stop=True; th.join(timeout=1)
meta={'model_id':MODEL,'revision':REV,'license':'creativeml-openrail-m','task':'text-to-image','prompt':PROMPT,'negative_prompt':NEG,'seed':SEED,'width':WIDTH,'height':HEIGHT,'num_inference_steps':STEPS,'guidance_scale':GUIDANCE,'scheduler':'DDIMScheduler','source_scheduler':'PNDMScheduler','runtime':{'python':platform.python_version(),'onnxruntime':ort.__version__,'diffusers':__import__('diffusers').__version__,'transformers':__import__('transformers').__version__,'numpy':np.__version__,'providers':unet_s.get_providers(),'gpu':subprocess.check_output(['nvidia-smi','--query-gpu=name,driver_version','--format=csv,noheader'],text=True).splitlines()[0]},'timings':timings,'peak_memory':{'process_rss_bytes':peak_rss,'gpu_0_used_mib':peak_gpu},'evidence':{'image':'generated.png','onnx_components':['text_encoder/model.onnx','unet/model.onnx','vae_encoder/model.onnx','vae_decoder/model.onnx']}}
(ROOT/'execution_evidence.json').write_text(json.dumps(meta,indent=2)+'\n')
print(json.dumps(meta,indent=2))