veil-pgd / ensemble /towers /internvit_loader.py
Klaus Clawd
Initial public release: VEIL-PGD v0.1
c793f45
Raw
History Blame Contribute Delete
2.16 kB
"""Differentiable loader for InternViT (OpenGVLab/InternViT-300M-448px-V2_5)."""
from __future__ import annotations
import glob
from pathlib import Path
import torch
import torch.nn as nn
import torch.nn.functional as F
from huggingface_hub import hf_hub_download
from transformers import AutoConfig, AutoModel
from _shim import apply_pretrained_shims
REPO = "OpenGVLab/InternViT-300M-448px-V2_5"
IMAGE_SIZE = 448
MEAN = (0.485, 0.456, 0.406)
STD = (0.229, 0.224, 0.225)
_STUB = Path(__file__).resolve().parent / "vendored" / "internvit" / "flash_attention.py"
def _patch_flash_attention_files() -> None:
stub = _STUB.read_text()
hub_path = hf_hub_download(REPO, "flash_attention.py")
Path(hub_path).write_text(stub)
for path in glob.glob(
str(Path.home() / "workspace/hf-cache/modules/transformers_modules/**/flash_attention.py"),
recursive=True,
):
if "InternViT" in path or "InternViT_hyphen" in path:
Path(path).write_text(stub)
def load_internvit(dtype: torch.dtype = torch.bfloat16) -> nn.Module:
apply_pretrained_shims()
_patch_flash_attention_files()
config = AutoConfig.from_pretrained(REPO, trust_remote_code=True)
config.use_flash_attn = False
model = AutoModel.from_pretrained(
REPO,
config=config,
trust_remote_code=True,
dtype=dtype,
)
model.eval()
model.requires_grad_(False)
return model.to(device="cuda", dtype=dtype)
def image_feat_internvit(model: nn.Module, x: torch.Tensor) -> torch.Tensor:
"""x: (1,3,H,W) in [0,1] on cuda, requires_grad=True. Returns (1, D) CLS feature."""
assert x.shape[0] == 1 and x.dim() == 4
mean = torch.tensor(MEAN, device=x.device, dtype=x.dtype).view(1, 3, 1, 1)
std = torch.tensor(STD, device=x.device, dtype=x.dtype).view(1, 3, 1, 1)
px = F.interpolate(x, size=(IMAGE_SIZE, IMAGE_SIZE), mode="bicubic", align_corners=False)
px = (px - mean) / std
dtype = next(model.parameters()).dtype
out = model(pixel_values=px.to(dtype=dtype))
feat = out.pooler_output.float()
if feat.dim() == 1:
feat = feat.unsqueeze(0)
return feat