mirror of
https://github.com/openai/CLIP.git
synced 2026-11-05 01:37:26 +00:00
[GH-ISSUE #30] Features: float16 if GPU available, float32 if CPU only #30
Labels
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
openai/CLIP#30
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @woctezuma on GitHub (Jan 31, 2021).
Original GitHub issue: https://github.com/openai/CLIP/issues/30
Hello,
I have noticed a discrepancy between the
dtypeof the features (both for images and texts) depending on the availability of a GPU.image_features.dtypereturnstorch.float32.This happens if do not install the package properly, and then do not pay attention that
deviceis set tocpu.image_features.dtypereturnstorch.float16.This happens if I follow the installation process properly and install proper versions of PyTorch (1.7.1+cu101) for Colab:
Q1: Is there a good reason why both versions do not return the same
dtype? Is it due to AMP with GPU?Moreover, if I wanted to store normalized features,
float16would allow me to cut in half the file size, so I would like to ensure that casting thefloat32results (obtained with CPU only) tofloat16would not actually lead to a loss of precision.Q2: Would casting the results to
float16be totally safe? Or would it be safer to cast tofloat32instead?Finally, the discrepancy can be slightly confusing for people who would pre-compute features on a machine with GPU, and then use the pre-computed features along with features computed on the fly in a web app with CPU only. This is how I noticed the discrepancy when running this line:
where
image_featureswere computed on the fly (float32) andzeroshot_weightshad been pre-computed (float16).@jongwook commented on GitHub (Feb 1, 2021):
Q1: This part of the loader code patches all fp16 operations to fp32 when loading on CPU. The main reason for this is because PyTorch does not support all fp16 operations in CPU mode.
Q2: In general, there can be a slight loss of accuracy compared to fp32, and training with fp16 weights can become unstable. Empirically, we have been doing CLIP inference in fp16 without much problem, and that's how the model was trained for anyway.
AFAIK, there's no runtime performance benefit of using FP16 operations on CPUs even if it's supported, because they are cast to fp32 anyway. BF16 SIMD was introduced in Cooper Lake last year, so this might change in the future.
@woctezuma commented on GitHub (Feb 1, 2021):
Thank you for the precision! :)
@ProGamerGov commented on GitHub (Feb 3, 2022):
For anyone else who comes across this feature and wants to use
torch.float32with the GPU: You can load CLIP models on to the GPU by usingtorch.device("cpu")for the device argument, and then placing the model onto the GPU after it's been downloaded and loaded: