mirror of
https://github.com/osmarks/nanogpt-experiments.git
synced 2024-11-10 20:09:58 +00:00
nondeterminism test
This commit is contained in:
parent
41ec7b3313
commit
46c68ad1a2
79
image_model_nondeterminism_test_ait.py
Normal file
79
image_model_nondeterminism_test_ait.py
Normal file
@ -0,0 +1,79 @@
|
||||
import torch
|
||||
from PIL import Image
|
||||
import open_clip
|
||||
import numpy as np
|
||||
|
||||
model_name = "ViT-SO400M-14-SigLIP-384"
|
||||
model, _, preprocess = open_clip.create_model_and_transforms(model_name, pretrained="webli", precision="fp16", device="cuda")
|
||||
model.eval()
|
||||
tokenizer = open_clip.get_tokenizer(model_name)
|
||||
|
||||
print(model)
|
||||
|
||||
from aitemplate.compiler import Model as AITModel
|
||||
from aitemplate.testing import detect_target
|
||||
|
||||
USE_CUDA = detect_target().name() == "cuda"
|
||||
|
||||
state = model.state_dict()
|
||||
conv_weights = state["visual.trunk.patch_embed.proj.weight"].permute((0, 2, 3, 1)).contiguous().cuda().half()
|
||||
|
||||
def load_pretrained():
|
||||
params = {}
|
||||
for key, value in state.items():
|
||||
orig_key = key
|
||||
if key.startswith("visual."):
|
||||
key = key.removeprefix("visual.") \
|
||||
.replace("trunk.patch_embed", "patch_embed") \
|
||||
.replace("trunk.blocks", "encoder.layers") \
|
||||
.replace(".attn.", ".mha.") \
|
||||
.replace(".norm1.", ".ln1.") \
|
||||
.replace(".norm2.", ".ln2.") \
|
||||
.replace("trunk.pos_embed", "pos_emb_pos_emb") \
|
||||
.replace("trunk.norm.", "encoder.ln.") \
|
||||
.replace("trunk.attn_pool.latent", "pool.probe") \
|
||||
.replace("trunk.attn_pool", "pool") \
|
||||
.replace("pool.norm", "pool.ln")
|
||||
if "patch_embed.proj.weight" not in key:
|
||||
params[key.replace(".", "_")] = value.cuda()
|
||||
#print(orig_key, key.replace(".", "_"))
|
||||
|
||||
params["patch_embed_proj_weight"] = conv_weights
|
||||
|
||||
return params
|
||||
|
||||
def generate_wrapper(path):
|
||||
ait_model = AITModel(path)
|
||||
ait_model.set_many_constants_with_tensors(load_pretrained())
|
||||
ait_model.fold_constants(sync=True)
|
||||
def wrapper(batch):
|
||||
xs = [batch.permute((0, 2, 3, 1)).contiguous()]
|
||||
ys = []
|
||||
for i in range(len(ait_model.get_output_name_to_index_map())):
|
||||
shape = ait_model.get_output_maximum_shape(i)
|
||||
ys.append(torch.empty(shape).cuda().half())
|
||||
ait_model.run_with_tensors(xs, ys)
|
||||
return ys[0][:, 0, :]
|
||||
return wrapper
|
||||
|
||||
encode_image = generate_wrapper("siglip/1.so")
|
||||
|
||||
print("preprocess")
|
||||
image = preprocess(Image.open("siglip.jpg")).unsqueeze(0).half().cuda()
|
||||
|
||||
print("fwd")
|
||||
features = encode_image(image)
|
||||
|
||||
avgmean = 0
|
||||
avgmax = 0
|
||||
n = 500
|
||||
with torch.no_grad():
|
||||
for _ in range(n):
|
||||
altered_features = encode_image(image)
|
||||
mean_diff = (features - altered_features).abs().mean().item()
|
||||
max_diff = (features - altered_features).max().item()
|
||||
print(f"{mean_diff:3f}, {max_diff:3f}")
|
||||
avgmean += mean_diff / n
|
||||
avgmax += max_diff / n
|
||||
|
||||
print(f"avg mean diff: {avgmean}, avg max diff: {avgmax}")
|
Loading…
Reference in New Issue
Block a user