pharmapsychotic/clip-interrogator

Can it run on Mac M1 (Apple silicon?)

slashdottir opened this issue · 3 comments

I love this proggie so much, wish I could run it on my M1 laptop.

Trying your readme example:

    from PIL import Image
    from clip_interrogator import Config, Interrogator
    
    image_path = "./images/art.jpg"
    image = Image.open(image_path).convert('RGB')
    ci = Interrogator(Config(clip_model_name="ViT-L-14/openai"))
    result = ci.interrogate(image)
    print(result)

It fails with this error:

 RuntimeError: "LayerNormKernelImpl" not implemented for 'Half'

stacktrace:

    i File "/Users/foo/src/pharmapsychotic_reverse_prompt/clip-interrogator/clip_interrogator/clip_interrogator.py", line 266, in __init__
        text_features = clip_model.encode_text(text_tokens)
      File "/opt/homebrew/anaconda3/envs/revprompt/lib/python3.10/site-packages/open_clip/model.py", line 235, in encode_text
        x = self.transformer(x, attn_mask=self.attn_mask)
      File "/opt/homebrew/anaconda3/envs/revprompt/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
        return forward_call(*args, **kwargs)
      File "/opt/homebrew/anaconda3/envs/revprompt/lib/python3.10/site-packages/open_clip/transformer.py", line 321, in forward
        x = r(x, attn_mask=attn_mask)
      File "/opt/homebrew/anaconda3/envs/revprompt/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
        return forward_call(*args, **kwargs)
      File "/opt/homebrew/anaconda3/envs/revprompt/lib/python3.10/site-packages/open_clip/transformer.py", line 242, in forward
        x = q_x + self.ls_1(self.attention(q_x=self.ln_1(q_x), k_x=k_x, v_x=v_x, attn_mask=attn_mask))
      File "/opt/homebrew/anaconda3/envs/revprompt/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
        return forward_call(*args, **kwargs)
      File "/opt/homebrew/anaconda3/envs/revprompt/lib/python3.10/site-packages/open_clip/transformer.py", line 27, in forward
        x = F.layer_norm(x, self.normalized_shape, self.weight, self.bias, self.eps)
      File "/opt/homebrew/anaconda3/envs/revprompt/lib/python3.10/site-packages/torch/nn/functional.py", line 2515, in layer_norm
        return torch.layer_norm(input, normalized_shape, weight, bias, eps, torch.backends.cudnn.enabled)
    RuntimeError: "LayerNormKernelImpl" not implemented for 'Half'
    python-BaseException

Tried setting device to 'cpu' instead of 'cuda', same error.

Thanks for any clues

hey I just finally got around to playing with it on M1 mac. it looks like it does work with pytorch 2 and fast mode is works well but "best" is very slow. if you haven't yet try updating to latest torch (pip install --upgrade torch)

I tried it out with the latest code and set the torch.device to 'mps' and it worked! The 'flavor chain' part is very slow, but it seemed to finish even with flavor chain only at 28% mark? Anyway. If there is a recommended way to set it to maximize use of M1 capabilities, please advise.

Seems like this bit of code here overrides the device setting and sets the torch device back to 'cuda' which of course defaults back to 'cpu'

image

Looks like there is a recent bug to fix this in pytorch (active 2 days ago): pytorch/pytorch#99272

Thank you! ❤️

There is already a PR suggesting autocast changes for a more recent version, but no fp16 is mentioned. Just wanna add that fp16 also works on mps. It reduces RAM usage in half.
Here is a hardcoded fp16 mps code for clip-interrogator==0.5.4