Full Code of mlfoundations/open_clip for AI

main 2896af3414c2 cached
229 files
7.8 MB
2.1M tokens
455 symbols
1 requests
Download .txt
Showing preview only (8,228K chars total). Download the full file or copy to clipboard to get everything.
Repository: mlfoundations/open_clip
Branch: main
Commit: 2896af3414c2
Files: 229
Total size: 7.8 MB

Directory structure:
gitextract_6ui6sr19/

├── .gitattributes
├── .github/
│   └── workflows/
│       ├── ci.yml
│       ├── clear-cache.yml
│       └── python-publish.yml
├── .gitignore
├── CITATION.cff
├── HISTORY.md
├── LICENSE
├── MANIFEST.in
├── Makefile
├── README.md
├── docs/
│   ├── Interacting_with_open_clip.ipynb
│   ├── Interacting_with_open_coca.ipynb
│   ├── LOW_ACC.md
│   ├── PRETRAINED.md
│   ├── clip_conceptual_captions.md
│   ├── clipa.md
│   ├── datacomp_models.md
│   ├── model_profile.csv
│   ├── openclip_classification_results.csv
│   ├── openclip_multilingual_retrieval_results.csv
│   ├── openclip_results.csv
│   ├── openclip_retrieval_results.csv
│   └── script_examples/
│       ├── clipa/
│       │   ├── vit_b16/
│       │   │   ├── i50_t16_finetune.sh
│       │   │   └── i50_t16_pretrain.sh
│       │   └── vit_l16/
│       │       ├── i17_t16_finetune.sh
│       │       ├── i17_t16_pretrain.sh
│       │       ├── i37_t8_finetune.sh
│       │       └── i37_t8_pretrain.sh
│       ├── clipav2/
│       │   └── vit_h14/
│       │       ├── i257_t32_finetunex4.sh
│       │       ├── i50_t8_pretrain.sh
│       │       └── i577_t32_finetunex1.sh
│       └── stability_example.sh
├── pyproject.toml
├── pytest.ini
├── requirements-test.txt
├── requirements-training.txt
├── requirements.txt
├── scripts/
│   ├── clipav1_vit_l16_i37_t8.sh
│   ├── clipav2_vit_h14_i84_224_336_cl32_gap_datacomp1b.sh
│   ├── h14_224_32_finetune.sh
│   └── h14_84_8_pretrain.sh
├── src/
│   ├── open_clip/
│   │   ├── __init__.py
│   │   ├── coca_model.py
│   │   ├── constants.py
│   │   ├── convert.py
│   │   ├── factory.py
│   │   ├── hf_configs.py
│   │   ├── hf_model.py
│   │   ├── loss.py
│   │   ├── model.py
│   │   ├── model_configs/
│   │   │   ├── EVA01-g-14-plus.json
│   │   │   ├── EVA01-g-14.json
│   │   │   ├── EVA02-B-16.json
│   │   │   ├── EVA02-E-14-plus.json
│   │   │   ├── EVA02-E-14.json
│   │   │   ├── EVA02-L-14-336.json
│   │   │   ├── EVA02-L-14.json
│   │   │   ├── MobileCLIP-B.json
│   │   │   ├── MobileCLIP-S1.json
│   │   │   ├── MobileCLIP-S2.json
│   │   │   ├── MobileCLIP2-B.json
│   │   │   ├── MobileCLIP2-L-14.json
│   │   │   ├── MobileCLIP2-S0.json
│   │   │   ├── MobileCLIP2-S2.json
│   │   │   ├── MobileCLIP2-S3.json
│   │   │   ├── MobileCLIP2-S4.json
│   │   │   ├── PE-Core-B-16.json
│   │   │   ├── PE-Core-L-14-336.json
│   │   │   ├── PE-Core-S-16-384.json
│   │   │   ├── PE-Core-T-16-384.json
│   │   │   ├── PE-Core-bigG-14-448.json
│   │   │   ├── RN101-quickgelu.json
│   │   │   ├── RN101.json
│   │   │   ├── RN50-quickgelu.json
│   │   │   ├── RN50.json
│   │   │   ├── RN50x16-quickgelu.json
│   │   │   ├── RN50x16.json
│   │   │   ├── RN50x4-quickgelu.json
│   │   │   ├── RN50x4.json
│   │   │   ├── RN50x64-quickgelu.json
│   │   │   ├── RN50x64.json
│   │   │   ├── ViT-B-16-SigLIP-256.json
│   │   │   ├── ViT-B-16-SigLIP-384.json
│   │   │   ├── ViT-B-16-SigLIP-512.json
│   │   │   ├── ViT-B-16-SigLIP-i18n-256.json
│   │   │   ├── ViT-B-16-SigLIP.json
│   │   │   ├── ViT-B-16-SigLIP2-256.json
│   │   │   ├── ViT-B-16-SigLIP2-384.json
│   │   │   ├── ViT-B-16-SigLIP2-512.json
│   │   │   ├── ViT-B-16-SigLIP2.json
│   │   │   ├── ViT-B-16-plus-240.json
│   │   │   ├── ViT-B-16-plus.json
│   │   │   ├── ViT-B-16-quickgelu.json
│   │   │   ├── ViT-B-16.json
│   │   │   ├── ViT-B-32-256.json
│   │   │   ├── ViT-B-32-SigLIP2-256.json
│   │   │   ├── ViT-B-32-plus-256.json
│   │   │   ├── ViT-B-32-quickgelu.json
│   │   │   ├── ViT-B-32.json
│   │   │   ├── ViT-H-14-378-quickgelu.json
│   │   │   ├── ViT-H-14-378.json
│   │   │   ├── ViT-H-14-CLIPA-336.json
│   │   │   ├── ViT-H-14-CLIPA.json
│   │   │   ├── ViT-H-14-quickgelu.json
│   │   │   ├── ViT-H-14-worldwide-378.json
│   │   │   ├── ViT-H-14-worldwide-quickgelu.json
│   │   │   ├── ViT-H-14-worldwide.json
│   │   │   ├── ViT-H-14.json
│   │   │   ├── ViT-H-16.json
│   │   │   ├── ViT-L-14-280.json
│   │   │   ├── ViT-L-14-336-quickgelu.json
│   │   │   ├── ViT-L-14-336.json
│   │   │   ├── ViT-L-14-CLIPA-336.json
│   │   │   ├── ViT-L-14-CLIPA.json
│   │   │   ├── ViT-L-14-quickgelu.json
│   │   │   ├── ViT-L-14-worldwide-quickgelu.json
│   │   │   ├── ViT-L-14-worldwide.json
│   │   │   ├── ViT-L-14.json
│   │   │   ├── ViT-L-16-320.json
│   │   │   ├── ViT-L-16-SigLIP-256.json
│   │   │   ├── ViT-L-16-SigLIP-384.json
│   │   │   ├── ViT-L-16-SigLIP2-256.json
│   │   │   ├── ViT-L-16-SigLIP2-384.json
│   │   │   ├── ViT-L-16-SigLIP2-512.json
│   │   │   ├── ViT-L-16.json
│   │   │   ├── ViT-M-16-alt.json
│   │   │   ├── ViT-M-16.json
│   │   │   ├── ViT-M-32-alt.json
│   │   │   ├── ViT-M-32.json
│   │   │   ├── ViT-S-16-alt.json
│   │   │   ├── ViT-S-16.json
│   │   │   ├── ViT-S-32-alt.json
│   │   │   ├── ViT-S-32.json
│   │   │   ├── ViT-SO400M-14-SigLIP-378.json
│   │   │   ├── ViT-SO400M-14-SigLIP-384.json
│   │   │   ├── ViT-SO400M-14-SigLIP.json
│   │   │   ├── ViT-SO400M-14-SigLIP2-378.json
│   │   │   ├── ViT-SO400M-14-SigLIP2.json
│   │   │   ├── ViT-SO400M-16-SigLIP-i18n-256.json
│   │   │   ├── ViT-SO400M-16-SigLIP2-256.json
│   │   │   ├── ViT-SO400M-16-SigLIP2-384.json
│   │   │   ├── ViT-SO400M-16-SigLIP2-512.json
│   │   │   ├── ViT-bigG-14-CLIPA-336.json
│   │   │   ├── ViT-bigG-14-CLIPA.json
│   │   │   ├── ViT-bigG-14-quickgelu.json
│   │   │   ├── ViT-bigG-14-worldwide-378.json
│   │   │   ├── ViT-bigG-14-worldwide.json
│   │   │   ├── ViT-bigG-14.json
│   │   │   ├── ViT-e-14.json
│   │   │   ├── ViT-g-14.json
│   │   │   ├── ViT-gopt-16-SigLIP2-256.json
│   │   │   ├── ViT-gopt-16-SigLIP2-384.json
│   │   │   ├── ViTamin-B-LTT.json
│   │   │   ├── ViTamin-B.json
│   │   │   ├── ViTamin-L-256.json
│   │   │   ├── ViTamin-L-336.json
│   │   │   ├── ViTamin-L-384.json
│   │   │   ├── ViTamin-L.json
│   │   │   ├── ViTamin-L2-256.json
│   │   │   ├── ViTamin-L2-336.json
│   │   │   ├── ViTamin-L2-384.json
│   │   │   ├── ViTamin-L2.json
│   │   │   ├── ViTamin-S-LTT.json
│   │   │   ├── ViTamin-S.json
│   │   │   ├── ViTamin-XL-256.json
│   │   │   ├── ViTamin-XL-336.json
│   │   │   ├── ViTamin-XL-384.json
│   │   │   ├── coca_ViT-B-32.json
│   │   │   ├── coca_ViT-L-14.json
│   │   │   ├── coca_base.json
│   │   │   ├── coca_roberta-ViT-B-32.json
│   │   │   ├── convnext_base.json
│   │   │   ├── convnext_base_w.json
│   │   │   ├── convnext_base_w_320.json
│   │   │   ├── convnext_large.json
│   │   │   ├── convnext_large_d.json
│   │   │   ├── convnext_large_d_320.json
│   │   │   ├── convnext_small.json
│   │   │   ├── convnext_tiny.json
│   │   │   ├── convnext_xlarge.json
│   │   │   ├── convnext_xxlarge.json
│   │   │   ├── convnext_xxlarge_320.json
│   │   │   ├── mt5-base-ViT-B-32.json
│   │   │   ├── mt5-xl-ViT-H-14.json
│   │   │   ├── nllb-clip-base-siglip.json
│   │   │   ├── nllb-clip-base.json
│   │   │   ├── nllb-clip-large-siglip.json
│   │   │   ├── nllb-clip-large.json
│   │   │   ├── roberta-ViT-B-32.json
│   │   │   ├── swin_base_patch4_window7_224.json
│   │   │   ├── vit_medium_patch16_gap_256.json
│   │   │   ├── vit_relpos_medium_patch16_cls_224.json
│   │   │   ├── xlm-roberta-base-ViT-B-32.json
│   │   │   └── xlm-roberta-large-ViT-H-14.json
│   │   ├── modified_resnet.py
│   │   ├── openai.py
│   │   ├── pos_embed.py
│   │   ├── pretrained.py
│   │   ├── push_to_hf_hub.py
│   │   ├── timm_model.py
│   │   ├── tokenizer.py
│   │   ├── transform.py
│   │   ├── transformer.py
│   │   ├── utils.py
│   │   ├── version.py
│   │   ├── zero_shot_classifier.py
│   │   └── zero_shot_metadata.py
│   └── open_clip_train/
│       ├── __init__.py
│       ├── data.py
│       ├── distributed.py
│       ├── file_utils.py
│       ├── logger.py
│       ├── main.py
│       ├── params.py
│       ├── precision.py
│       ├── profiler.py
│       ├── scheduler.py
│       ├── train.py
│       └── zero_shot.py
├── tests/
│   ├── test_download_pretrained.py
│   ├── test_hf_model.py
│   ├── test_inference.py
│   ├── test_inference_simple.py
│   ├── test_num_shards.py
│   ├── test_training_simple.py
│   ├── test_wds.py
│   └── util_test.py
└── tutorials/
    └── int8_tutorial.ipynb

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
*.py linguist-language=python
*.ipynb linguist-documentation


================================================
FILE: .github/workflows/ci.yml
================================================
name: Continuous integration

on:
  push:
    branches:
    - main 
    paths-ignore:
    - '**.md'
    - 'CITATION.cff'
    - 'LICENSE'
    - '.gitignore'
    - 'docs/**'
  pull_request:
    branches:
    - main 
    paths-ignore:
    - '**.md'
    - 'CITATION.cff'
    - 'LICENSE'
    - '.gitignore'
    - 'docs/**'
  workflow_dispatch:
    inputs:
      manual_revision_reference:
        required: false
        type: string
      manual_revision_test:
        required: false
        type: string

env:
  REVISION_REFERENCE: v2.8.2
  #9d31b2ec4df6d8228f370ff20c8267ec6ba39383 earliest compatible v2.7.0 + pretrained_hf param

jobs:
  Tests:
    strategy:
      matrix:
        os: [ ubuntu-latest ] #, macos-latest ]
        python: [ '3.10' ]
        job_num: [ 4 ]
        job: [ 1, 2, 3, 4 ]
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v3
      with:
        fetch-depth: 0
        ref: ${{ inputs.manual_revision_test }}
    - name: Set up Python ${{ matrix.python }}
      id: pythonsetup
      uses: actions/setup-python@v4
      with:
        python-version: ${{ matrix.python }}
    - name: Venv cache
      id: venv-cache
      uses: actions/cache@v3
      with:
        path: .env
        key: venv-${{ matrix.os }}-${{ steps.pythonsetup.outputs.python-version }}-${{ hashFiles('requirements*') }}
    - name: Pytest durations cache
      uses: actions/cache@v3
      with:
        path: .test_durations
        key: test_durations-${{ matrix.os }}-${{ steps.pythonsetup.outputs.python-version }}-${{ matrix.job }}-${{ github.run_id }}
        restore-keys: test_durations-0-
    - name: Setup
      if: steps.venv-cache.outputs.cache-hit != 'true'
      run: |
        python3 -m venv .env
        source .env/bin/activate
        pip install -e .[test]
    - name: Prepare test data
      run: |
        source .env/bin/activate
        python -m pytest \
          --quiet --co \
          --splitting-algorithm least_duration \
          --splits ${{ matrix.job_num }} \
          --group ${{ matrix.job }} \
          -m regression_test \
          tests \
          | head -n -2 | grep -Po 'test_inference_with_data\[\K[^]]*(?=-False]|-True])' \
          > models_gh_runner.txt
        if [ -n "${{ inputs.manual_revision_reference }}" ]; then
          REVISION_REFERENCE=${{ inputs.manual_revision_reference }}
        fi
        python tests/util_test.py \
          --save_model_list models_gh_runner.txt \
          --model_list models_gh_runner.txt \
          --git_revision $REVISION_REFERENCE
    - name: Unit tests
      run: |
        source .env/bin/activate
        if [[ -f .test_durations ]]
        then
          cp .test_durations durations_1
          mv .test_durations durations_2
        fi
        python -m pytest \
          -x -s -v \
          --splitting-algorithm least_duration \
          --splits ${{ matrix.job_num }} \
          --group ${{ matrix.job }} \
          --store-durations \
          --durations-path durations_1 \
          --clean-durations \
          -m "not regression_test" \
          tests
        OPEN_CLIP_TEST_REG_MODELS=models_gh_runner.txt python -m pytest \
          -x -s -v \
          --store-durations \
          --durations-path durations_2 \
          --clean-durations \
          -m "regression_test" \
          tests
        jq -s -S 'add' durations_* > .test_durations
    - name: Collect pytest durations
      uses: actions/upload-artifact@v4
      with:
        name: pytest_durations_${{ matrix.os }}-${{ matrix.python }}-${{ matrix.job }}
        path: .test_durations


================================================
FILE: .github/workflows/clear-cache.yml
================================================
name: Clear cache

on:
  workflow_dispatch:

permissions:
  actions: write

jobs:
  clear-cache:
    runs-on: ubuntu-latest
    steps:
      - name: Clear cache
        uses: actions/github-script@v6
        with:
          script: |
            const caches = await github.rest.actions.getActionsCacheList({
              owner: context.repo.owner,
              repo: context.repo.repo,
            })
            for (const cache of caches.data.actions_caches) {
              console.log(cache)
              await github.rest.actions.deleteActionsCacheById({
                owner: context.repo.owner,
                repo: context.repo.repo,
                cache_id: cache.id,
              })
            }



================================================
FILE: .github/workflows/python-publish.yml
================================================
name: Release

on:
  push:
    branches:
    - main
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: actions-ecosystem/action-regex-match@v2
      id: regex-match
      with:
        text: ${{ github.event.head_commit.message }}
        regex: '^Release ([^ ]+)'
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: '3.10'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install setuptools wheel twine build
    - name: Release
      if: ${{ steps.regex-match.outputs.match != '' }}
      uses: softprops/action-gh-release@v1
      with:
        tag_name: v${{ steps.regex-match.outputs.group1 }}
    - name: Build and publish
      if: ${{ steps.regex-match.outputs.match != '' }}
      env:
        TWINE_USERNAME: __token__
        TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
      run: |
        python -m build
        twine upload dist/*


================================================
FILE: .gitignore
================================================
**/logs/
**/wandb/
models/
features/
results/

tests/data/
*.pt

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/
sync.sh
gpu1sync.sh
.idea
*.pdf
**/._*
**/*DS_*
**.jsonl
src/sbatch
src/misc
.vscode
src/debug
core.*

# Allow
!src/evaluation/misc/results_dbs/*


================================================
FILE: CITATION.cff
================================================
cff-version: 1.1.0
message: If you use this software, please cite it as below.
authors:
  - family-names: Ilharco
    given-names: Gabriel
  - family-names: Wortsman
    given-names: Mitchell
  - family-names: Wightman
    given-names: Ross
  - family-names: Gordon
    given-names: Cade   
  - family-names: Carlini
    given-names: Nicholas
  - family-names: Taori
    given-names: Rohan
  - family-names: Dave
    given-names: Achal
  - family-names: Shankar
    given-names: Vaishaal
  - family-names: Namkoong
    given-names: Hongseok
  - family-names: Miller
    given-names: John
  - family-names: Hajishirzi
    given-names: Hannaneh
  - family-names: Farhadi
    given-names: Ali
  - family-names: Schmidt
    given-names: Ludwig
title: OpenCLIP
version: v0.1
doi: 10.5281/zenodo.5143773
date-released: 2021-07-28


================================================
FILE: HISTORY.md
================================================
## 2.24.0

* Fix missing space in error message
* use model flag for normalizing embeddings
* init logit_bias for non siglip pretrained models
* Fix logit_bias load_checkpoint addition 
* Make CoCa model match CLIP models for logit scale/bias init
* Fix missing return of "logit_bias" in CoCa.forward
* Add NLLB-CLIP with SigLIP models
* Add get_logits method and NLLB tokenizer
* Remove the empty file src/open_clip/generation_utils.py
* Update params.py: "BatchNorm" -> "LayerNorm" in the description string for "--lock-text-freeze-layer-norm"

## 2.23.0

* Add CLIPA-v2 models
* Add SigLIP models
* Add MetaCLIP models
* Add NLLB-CLIP models
* CLIPA train code
* Minor changes/fixes
    * Remove protobuf version limit
    * Stop checking model name when loading CoCa models
    * Log native wandb step
    * Use bool instead of long masks

## 2.21.0

* Add SigLIP loss + training support
* Add more DataComp models (B/16, B/32 and B/32@256)
* Update default num workers
* Update CoCa generation for `transformers>=4.31`
* PyTorch 2.0 `state_dict()` compatibility fix for compiled models
* Fix padding in `ResizeMaxSize`
* Convert JIT model on state dict load for `pretrained='filename…'`
* Other minor changes and fixes (typos, README, dependencies, CI)

## 2.20.0

* Add EVA models
* Support serial worker training
* Fix Python 3.7 compatibility 

## 2.19.0

* Add DataComp models

## 2.18.0

* Enable int8 inference without `.weight` attribute

## 2.17.2

* Update push_to_hf_hub

## 2.17.0

* Add int8 support
* Update notebook demo
* Refactor zero-shot classification code

## 2.16.2

* Fixes for context_length and vocab_size attributes 

## 2.16.1

* Fixes for context_length and vocab_size attributes 
* Fix --train-num-samples logic
* Add HF BERT configs for PubMed CLIP model

## 2.16.0

* Add improved g-14 weights
* Update protobuf version

## 2.15.0

* Add convnext_xxlarge weights
* Fixed import in readme
* Add samples per second per gpu logging
* Fix slurm example

## 2.14.0

* Move dataset mixtures logic to shard level
* Fix CoCa accum-grad training
* Safer transformers import guard
* get_labels refactoring

## 2.13.0

* Add support for dataset mixtures with different sampling weights
* Make transformers optional again 

## 2.12.0

* Updated convnext configs for consistency
* Added input_patchnorm option
* Clean and improve CoCa generation
* Support model distillation
* Add ConvNeXt-Large 320x320 fine-tune weights

## 2.11.1

* Make transformers optional
* Add MSCOCO CoCa finetunes to pretrained models

## 2.11.0

* coca support and weights
* ConvNeXt-Large weights

## 2.10.1

* `hf-hub:org/model_id` support for loading models w/ config and weights in Hugging Face Hub

## 2.10.0

* Added a ViT-bigG-14 model.
* Added an up-to-date example slurm script for large training jobs.
* Added a option to sync logs and checkpoints to S3 during training.
* New options for LR schedulers, constant and constant with cooldown
* Fix wandb autoresuming when resume is not set
* ConvNeXt `base` & `base_w` pretrained models added
* `timm-` model prefix removed from configs
* `timm` augmentation + regularization (dropout / drop-path) supported

## 2.9.3

* Fix wandb collapsing multiple parallel runs into a single one

## 2.9.2

* Fix braceexpand memory explosion for complex webdataset urls

## 2.9.1

* Fix release

## 2.9.0

* Add training feature to auto-resume from the latest checkpoint on restart via `--resume latest`
* Allow webp in webdataset
* Fix logging for number of samples when using gradient accumulation
* Add model configs for convnext xxlarge

## 2.8.2

* wrapped patchdropout in a torch.nn.Module

## 2.8.1

* relax protobuf dependency
* override the default patch dropout value in 'vision_cfg'

## 2.8.0

* better support for HF models
* add support for gradient accumulation
* CI fixes
* add support for patch dropout
* add convnext configs


## 2.7.0

* add multilingual H/14 xlm roberta large

## 2.6.1

* fix setup.py _read_reqs

## 2.6.0

* Make openclip training usable from pypi.
* Add xlm roberta large vit h 14 config.

## 2.5.0

* pretrained B/32 xlm roberta base: first multilingual clip trained on laion5B
* pretrained B/32 roberta base: first clip trained using an HF text encoder

## 2.4.1

* Add missing hf_tokenizer_name in CLIPTextCfg.

## 2.4.0

* Fix #211, missing RN50x64 config. Fix type of dropout param for ResNet models
* Bring back LayerNorm impl that casts to input for non bf16/fp16 
* zero_shot.py: set correct tokenizer based on args
* training/params.py: remove hf params and get them from model config

## 2.3.1

* Implement grad checkpointing for hf model.
* custom_text: True if hf_model_name is set
* Disable hf tokenizer parallelism 

## 2.3.0

* Generalizable Text Transformer with HuggingFace Models (@iejMac)

## 2.2.0

* Support for custom text tower
* Add checksum verification for pretrained model weights 

## 2.1.0

* lot including sota models, bfloat16 option, better loading, better metrics

## 1.2.0

* ViT-B/32 trained on Laion2B-en
* add missing openai RN50x64 model

## 1.1.1

* ViT-B/16+
* Add grad checkpointing support
* more robust data loader


================================================
FILE: LICENSE
================================================
Copyright (c) 2012-2021 Gabriel Ilharco, Mitchell Wortsman, 
Nicholas Carlini, Rohan Taori, Achal Dave, Vaishaal Shankar, 
John Miller, Hongseok Namkoong, Hannaneh Hajishirzi, Ali Farhadi, 
Ludwig Schmidt

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: MANIFEST.in
================================================
include src/open_clip/bpe_simple_vocab_16e6.txt.gz
include src/open_clip/model_configs/*.json



================================================
FILE: Makefile
================================================
install: ## [Local development] Upgrade pip, install requirements, install package.
	python -m pip install -U pip
	python -m pip install -e .

install-training:
	python -m pip install -r requirements-training.txt

install-test: ## [Local development] Install test requirements
	python -m pip install -r requirements-test.txt

test: ## [Local development] Run unit tests
	python -m pytest -x -s -v tests


================================================
FILE: README.md
================================================
# OpenCLIP

[[Paper]](https://arxiv.org/abs/2212.07143) [[Citations]](#citing) [[Clip Colab]](https://colab.research.google.com/github/mlfoundations/open_clip/blob/master/docs/Interacting_with_open_clip.ipynb) [[Coca Colab]](https://colab.research.google.com/github/mlfoundations/open_clip/blob/master/docs/Interacting_with_open_coca.ipynb)
[![pypi](https://img.shields.io/pypi/v/open_clip_torch.svg)](https://pypi.python.org/pypi/open_clip_torch)

Welcome to an open source implementation of OpenAI's [CLIP](https://arxiv.org/abs/2103.00020) (Contrastive Language-Image Pre-training).

Using this codebase, we have trained several models on a variety of data sources and compute budgets, ranging from [small-scale experiments](docs/LOW_ACC.md) to larger runs including models trained on datasets such as [LAION-400M](https://arxiv.org/abs/2111.02114), [LAION-2B](https://arxiv.org/abs/2210.08402) and [DataComp-1B](https://arxiv.org/abs/2304.14108).
Many of our models and their scaling properties are studied in detail in the paper [reproducible scaling laws for contrastive language-image learning](https://arxiv.org/abs/2212.07143).
Some of the best models we've trained and their zero-shot ImageNet-1k accuracy are shown below, along with the ViT-L model trained by OpenAI and other state-of-the-art open source alternatives (all can be loaded via OpenCLIP).
We provide more details about our full collection of pretrained models [here](docs/PRETRAINED.md), and zero-shot results for 38 datasets [here](docs/openclip_results.csv).



| Model    | Training data | Resolution | # of samples seen | ImageNet zero-shot acc. | 
| -------- | ------- |  ------- |  ------- |  ------- |  
| ConvNext-Base | LAION-2B  | 256px | 13B | 71.5% |
| ConvNext-Large | LAION-2B  | 320px | 29B | 76.9% |
| ConvNext-XXLarge | LAION-2B | 256px | 34B | 79.5% |
| ViT-B-32-256  | DataComp-1B  | 256px | 34B | 72.8% |
| ViT-B-16  | DataComp-1B  | 224px | 13B | 73.5% |
| ViT-L-14  | LAION-2B  | 224px | 32B | 75.3% |
| ViT-H-14  | LAION-2B  | 224px | 32B | 78.0% |
| ViT-L-14  | DataComp-1B  | 224px | 13B | 79.2% |
| ViT-bigG-14  | LAION-2B  | 224px | 34B | 80.1% |
|  |  |   |   |  |
| ViT-L-14-quickgelu [(Original CLIP)](https://arxiv.org/abs/2103.00020) | WIT | 224px | 13B | 75.5% | 
| ViT-SO400M-14-SigLIP [(SigLIP)](https://arxiv.org/abs/2303.15343) | WebLI | 224px | 45B | 82.0% | 
| ViT-L-14 [(DFN)](https://arxiv.org/abs/2309.17425) | DFN-2B | 224px | 39B | 82.2% | 
| ViT-L-16-256 [(SigLIP2)](https://arxiv.org/abs/2502.14786) |  WebLI (multi-lang) | 256px | 40B | 82.5% |
| ViT-SO400M-14-SigLIP-384 [(SigLIP)](https://arxiv.org/abs/2303.15343) |  WebLI | 384px | 45B | 83.1% |
| ViT-H-14-quickgelu [(DFN)](https://arxiv.org/abs/2309.17425) | DFN-5B | 224px | 39B | 83.4% | 
| PE-Core-L-14-336 [(PE)](https://arxiv.org/abs/2504.13181) | MetaCLIP-5.4B | 336px | 58B | 83.5% |
| ViT-SO400M-16-SigLIP2-384 [(SigLIP2)](https://arxiv.org/abs/2502.14786) |  WebLI (multi-lang) | 384px | 40B | 84.1% |
| ViT-H-14-378-quickgelu [(DFN)](https://arxiv.org/abs/2309.17425) | DFN-5B | 378px | 44B | 84.4% |
| ViT-gopt-16-SigLIP2-384 [(SigLIP2)](https://arxiv.org/abs/2502.14786) | WebLI (multi-lang) | 384px | 40B | 85.0% |
| PE-Core-bigG-14-448 [(PE)](https://arxiv.org/abs/2504.13181) | MetaCLIP-5.4B | 448px | 86B | 85.4% |

Model cards with additional model specific details can be found on the Hugging Face Hub under the OpenCLIP library tag: https://huggingface.co/models?library=open_clip. 

If you found this repository useful, please consider [citing](#citing).
We welcome anyone to submit an issue or send an email if you have any other requests or suggestions.

Note that portions of `src/open_clip/` modelling and tokenizer code are adaptations of OpenAI's official [repository](https://github.com/openai/CLIP).

## Approach

| ![CLIP](https://raw.githubusercontent.com/mlfoundations/open_clip/main/docs/CLIP.png) |
|:--:|
| Image Credit: https://github.com/openai/CLIP |

## Usage

```
pip install open_clip_torch
```

```python
import torch
from PIL import Image
import open_clip

model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', pretrained='laion2b_s34b_b79k')
model.eval()  # model in train mode by default, impacts some models with BatchNorm or stochastic depth active
tokenizer = open_clip.get_tokenizer('ViT-B-32')

image = preprocess(Image.open("docs/CLIP.png")).unsqueeze(0)
text = tokenizer(["a diagram", "a dog", "a cat"])

with torch.no_grad(), torch.autocast("cuda"):
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)
    image_features /= image_features.norm(dim=-1, keepdim=True)
    text_features /= text_features.norm(dim=-1, keepdim=True)

    text_probs = (100.0 * image_features @ text_features.T).softmax(dim=-1)

print("Label probs:", text_probs)  # prints: [[1., 0., 0.]]
```

If model uses `timm` image encoders (convnext, siglip, eva, etc) ensure the latest timm is installed. Upgrade `timm` if you see 'Unknown model' errors for the image encoder.

If model uses transformers tokenizers, ensure `transformers` is installed.

See also this [[Clip Colab]](https://colab.research.google.com/github/mlfoundations/open_clip/blob/master/docs/Interacting_with_open_clip.ipynb).

To compute billions of embeddings efficiently, you can use [clip-retrieval](https://github.com/rom1504/clip-retrieval) which has openclip support.

### Pretrained models

We offer a simple model interface to instantiate both pre-trained and untrained models.
To see which pretrained models are available, use the following code snippet.
More details about our pretrained models are available [here](docs/PRETRAINED.md).

```python
>>> import open_clip
>>> open_clip.list_pretrained()
```

You can find more about the models we support (e.g. number of parameters, FLOPs) in [this table](docs/model_profile.csv).

NOTE: Many existing checkpoints use the QuickGELU activation from the original OpenAI models. This activation is actually less efficient than native torch.nn.GELU in recent versions of PyTorch. The model defaults are now nn.GELU, so one should use model definitions with `-quickgelu` postfix for the OpenCLIP pretrained weights. All OpenAI pretrained weights will always default to QuickGELU. One can also use the non `-quickgelu` model definitions with pretrained weights using QuickGELU but there will be an accuracy drop, for fine-tune that will likely vanish for longer runs.
Future trained models will use nn.GELU.

### Loading models

Models can be loaded with `open_clip.create_model_and_transforms`, as shown in the example below. The model name and corresponding `pretrained` keys are compatible with the outputs of `open_clip.list_pretrained()`. 

The `pretrained` argument also accepts local paths, for example `/path/to/my/b32.pt`.
You can also load checkpoints from huggingface this way. To do so, download the `open_clip_pytorch_model.bin` file (for example, [https://huggingface.co/laion/CLIP-ViT-L-14-DataComp.XL-s13B-b90K/tree/main](https://huggingface.co/laion/CLIP-ViT-L-14-DataComp.XL-s13B-b90K/blob/main/open_clip_pytorch_model.bin)), and use `pretrained=/path/to/open_clip_pytorch_model.bin`.

```python
# pretrained also accepts local paths
model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', pretrained='laion2b_s34b_b79k') 
```

## Fine-tuning on classification tasks

This repository is focused on training CLIP models. To fine-tune a *trained* zero-shot model on a downstream classification task such as ImageNet, please see [our other repository: WiSE-FT](https://github.com/mlfoundations/wise-ft). The [WiSE-FT repository](https://github.com/mlfoundations/wise-ft) contains code for our paper on [Robust Fine-tuning of Zero-shot Models](https://arxiv.org/abs/2109.01903), in which we introduce a technique for fine-tuning zero-shot models while preserving robustness under distribution shift.

## Data

To download datasets as webdataset, we recommend [img2dataset](https://github.com/rom1504/img2dataset).

### Conceptual Captions

See [cc3m img2dataset example](https://github.com/rom1504/img2dataset/blob/main/dataset_examples/cc3m.md).

### YFCC and other datasets

In addition to specifying the training data via CSV files as mentioned above, our codebase also supports [webdataset](https://github.com/webdataset/webdataset), which is recommended for larger scale datasets. The expected format is a series of `.tar` files. Each of these `.tar` files should contain two files for each training example, one for the image and one for the corresponding text. Both files should have the same name but different extensions. For instance, `shard_001.tar` could contain files such as `abc.jpg` and `abc.txt`. You can learn more about `webdataset` at [https://github.com/webdataset/webdataset](https://github.com/webdataset/webdataset). We use `.tar` files with 1,000 data points each, which we create using [tarp](https://github.com/webdataset/tarp).

You can download the YFCC dataset from [Multimedia Commons](http://mmcommons.org/).
Similar to OpenAI, we used a subset of YFCC to reach the aforementioned accuracy numbers.
The indices of images in this subset are in [OpenAI's CLIP repository](https://github.com/openai/CLIP/blob/main/data/yfcc100m.md).


## Training CLIP

### Install

We advise you first create a virtual environment with:

```
python3 -m venv .env
source .env/bin/activate
pip install -U pip
```

You can then install openclip for training with `pip install 'open_clip_torch[training]'`.

#### Development

If you want to make changes to contribute code, you can clone openclip then run `make install` in openclip folder (after creating a virtualenv)

Install pip PyTorch as per https://pytorch.org/get-started/locally/

You may run `make install-training` to install training deps

#### Testing

Test can be run with `make install-test` then `make test`

`python -m pytest -x -s -v tests -k "training"` to run a specific test

Running regression tests against a specific git revision or tag:
1. Generate testing data
    ```sh
    python tests/util_test.py --model RN50 RN101 --save_model_list models.txt --git_revision 9d31b2ec4df6d8228f370ff20c8267ec6ba39383
    ```
    **_WARNING_: This will invoke git and modify your working tree, but will reset it to the current state after data has been generated! \
    Don't modify your working tree while test data is being generated this way.**

2. Run regression tests
    ```sh
    OPEN_CLIP_TEST_REG_MODELS=models.txt python -m pytest -x -s -v -m regression_test
    ```

### Sample single-process running code:

```bash
python -m open_clip_train.main \
    --save-frequency 1 \
    --zeroshot-frequency 1 \
    --report-to tensorboard \
    --train-data="/path/to/train_data.csv"  \
    --val-data="/path/to/validation_data.csv"  \
    --csv-img-key filepath \
    --csv-caption-key title \
    --imagenet-val=/path/to/imagenet/root/val/ \
    --warmup 10000 \
    --batch-size=128 \
    --lr=1e-3 \
    --wd=0.1 \
    --epochs=30 \
    --workers=8 \
    --model RN50
```

Note: `imagenet-val` is the path to the *validation* set of ImageNet for zero-shot evaluation, not the training set!
You can remove this argument if you do not want to perform zero-shot evaluation on ImageNet throughout training. Note that the `val` folder should contain subfolders. If it does not, please use [this script](https://raw.githubusercontent.com/soumith/imagenetloader.torch/master/valprep.sh).

### Multi-GPU and Beyond

This code has been battle tested up to 1024 A100s and offers a variety of solutions
for distributed training. We include native support for SLURM clusters.

As the number of devices used to train increases, so does the space complexity of
the the logit matrix. Using a naïve all-gather scheme, space complexity will be
`O(n^2)`. Instead, complexity may become effectively linear if the flags
`--gather-with-grad` and `--local-loss` are used. This alteration results in one-to-one
numerical results as the naïve method.

#### Epochs

For larger datasets (eg Laion2B), we recommend setting `--train-num-samples` to a lower value than the full epoch, for example `--train-num-samples 135646078` to 1/16 of an epoch in conjunction with `--dataset-resampled` to do sampling with replacement. This allows having frequent checkpoints to evaluate more often.

#### Patch Dropout

<a href="https://arxiv.org/abs/2212.00794">Recent research</a> has shown that one can dropout half to three-quarters of the visual tokens, leading to up to 2-3x training speeds without loss of accuracy.

You can set this on your visual transformer config with the key `patch_dropout`.

In the paper, they also finetuned without the patch dropout at the end. You can do this with the command-line argument `--force-patch-dropout 0.`

#### Multiple data sources

OpenCLIP supports using multiple data sources, by separating different data paths with `::`.
For instance, to train on CC12M and on LAION, one might use `--train-data "/data/cc12m/cc12m-train-{0000..2175}.tar::/data/LAION-400M/{00000..41455}.tar"`.
Using `--dataset-resampled` is recommended for these cases.

By default, on expectation the amount of times the model will see a sample from each source is proportional to the size of the source.
For instance, when training on one data source with size 400M and one with size 10M, samples from the first source are 40x more likely to be seen in expectation.

We also support different weighting of the data sources, by using the `--train-data-upsampling-factors` flag.
For instance, using `--train-data-upsampling-factors=1::1` in the above scenario is equivalent to not using the flag, and `--train-data-upsampling-factors=1::2` is equivalent to upsampling the second data source twice.
If you want to sample from data sources with the same frequency, the upsampling factors should be inversely proportional to the sizes of the data sources.
For instance, if dataset `A` has 1000 samples and dataset `B` has 100 samples, you can use `--train-data-upsampling-factors=0.001::0.01` (or analogously, `--train-data-upsampling-factors=1::10`).

#### Single-Node

We make use of `torchrun` to launch distributed jobs. The following launches a
a job on a node of 4 GPUs:

```bash
cd open_clip/src
torchrun --nproc_per_node 4 -m open_clip_train.main \
    --train-data '/data/cc12m/cc12m-train-{0000..2175}.tar' \
    --train-num-samples 10968539 \
    --dataset-type webdataset \
    --batch-size 320 \
    --precision amp \
    --workers 4 \
    --imagenet-val /data/imagenet/validation/
```

#### Multi-Node

The same script above works, so long as users include information about the number
of nodes and host node.

```bash
cd open_clip/src
torchrun --nproc_per_node=4 \
    --rdzv_endpoint=$HOSTE_NODE_ADDR \
    -m open_clip_train.main \
    --train-data '/data/cc12m/cc12m-train-{0000..2175}.tar' \
    --train-num-samples 10968539 \
    --dataset-type webdataset \
    --batch-size 320 \
    --precision amp \
    --workers 4 \
    --imagenet-val /data/imagenet/validation/
```

#### SLURM

This is likely the easiest solution to utilize. The following script was used to
train our largest models:

```bash
#!/bin/bash -x
#SBATCH --nodes=32
#SBATCH --gres=gpu:4
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=6
#SBATCH --wait-all-nodes=1
#SBATCH --job-name=open_clip
#SBATCH --account=ACCOUNT_NAME
#SBATCH --partition PARTITION_NAME

eval "$(/path/to/conda/bin/conda shell.bash hook)" # init conda
conda activate open_clip
export CUDA_VISIBLE_DEVICES=0,1,2,3
export MASTER_PORT=12802

master_addr=$(scontrol show hostnames "$SLURM_JOB_NODELIST" | head -n 1)
export MASTER_ADDR=$master_addr

cd /shared/open_clip
export PYTHONPATH="$PYTHONPATH:$PWD/src"
srun --cpu_bind=v --accel-bind=gn python -u src/open_clip_train/main.py \
    --save-frequency 1 \
    --report-to tensorboard \
    --train-data="/data/LAION-400M/{00000..41455}.tar" \
    --warmup 2000 \
    --batch-size=256 \
    --epochs=32 \
    --workers=8 \
    --model ViT-B-32 \
    --name "ViT-B-32-Vanilla" \
    --seed 0 \
    --local-loss \
    --gather-with-grad
```

### Resuming from a checkpoint:

```bash
python -m open_clip_train.main \
    --train-data="/path/to/train_data.csv" \
    --val-data="/path/to/validation_data.csv"  \
    --resume /path/to/checkpoints/epoch_K.pt
```

### Training CoCa:
Training [CoCa](https://arxiv.org/abs/2205.01917) models is enabled through specifying a CoCa config using the ```--model``` parameter of the training script. Currently available configs are "coca_base", "coca_ViT-B-32", and "coca_roberta-ViT-B-32" (which uses RoBERTa as the text encoder). CoCa configs are different from CLIP configs because they have an additional "multimodal_cfg" component which specifies parameters for the multimodal text decoder. Here's an example from the coca_ViT-B-32 config:
```json
"multimodal_cfg": {
	"context_length": 76,
	"vocab_size": 49408,
	"width": 512,
	"heads": 8,
	"layers": 12,
	"latent_dim": 512,
	"attn_pooler_heads": 8
}
```
Credit to [lucidrains](https://github.com/lucidrains) for [initial code](https://github.com/lucidrains/CoCa-pytorch), [gpucce](https://github.com/gpucce) for adapting the code to open_clip, and [iejMac](https://github.com/iejMac) for training the models.

### Generating text with CoCa

```python
import open_clip
import torch
from PIL import Image

model, _, transform = open_clip.create_model_and_transforms(
  model_name="coca_ViT-L-14",
  pretrained="mscoco_finetuned_laion2B-s13B-b90k"
)

im = Image.open("cat.jpg").convert("RGB")
im = transform(im).unsqueeze(0)

with torch.no_grad(), torch.cuda.amp.autocast():
  generated = model.generate(im)

print(open_clip.decode(generated[0]).split("<end_of_text>")[0].replace("<start_of_text>", ""))
```

See also this [[Coca Colab]](https://colab.research.google.com/github/mlfoundations/open_clip/blob/master/docs/Interacting_with_open_coca.ipynb)

### Fine Tuning CoCa

To fine-tune coca on mscoco, first create the dataset, one way is using a csvdataset and perhaps the simplest way to do it is using [CLIP_benchmark](https://github.com/LAION-AI/CLIP_benchmark) which in turn uses [pycocotools](https://github.com/cocodataset/cocoapi) (that can be used also by itself).

```python
from clip_benchmark.datasets.builder import build_dataset
import pandas as pd
import os

root_path = "path/to/data/dir" # set this to smth meaningful
ds = build_dataset("mscoco_captions", root=root_path, split="train", task="captioning") # this downloads the dataset if it is not there already
coco = ds.coco
imgs = coco.loadImgs(coco.getImgIds())
future_df = {"filepath":[], "title":[]}
for img in imgs:
    caps = coco.imgToAnns[img["id"]]
    for cap in caps:
        future_df["filepath"].append(img["file_name"])
        future_df["title"].append(cap["caption"])
pd.DataFrame.from_dict(future_df).to_csv(
  os.path.join(root_path, "train2014.csv"), index=False, sep="\t"
)
```
This should create a csv dataset that one can use to fine-tune coca with open_clip
```bash
python -m open_clip_train.main \
    --dataset-type "csv" \
    --train-data "path/to/data/dir/train2014.csv" \
    --warmup 1000 \
    --batch-size 128 \
    --lr 1e-5 \
    --wd 0.1 \
    --epochs 1 \
    --workers 3 \
    --model "coca_ViT-L-14" \
    --report-to "wandb" \
    --coca-contrastive-loss-weight 0 \
    --coca-caption-loss-weight 1 \
    --log-every-n-steps 100
```

This is a general setting, open_clip has very parameters that can be set, ```python -m open_clip_train.main --help``` should show them. The only relevant change compared to pre-training are the two arguments

```bash
--coca-contrastive-loss-weight 0
--coca-caption-loss-weight 1
```
which make the model only train the generative side.

### Training with pre-trained language models as text encoder:

If you wish to use different language models as the text encoder for CLIP you can do so by using one of the Hugging Face model configs in ```src/open_clip/model_configs``` and passing in it's tokenizer as the ```--model``` and ```--hf-tokenizer-name``` parameters respectively. Currently we only support RoBERTa ("test-roberta" config), however adding new models should be trivial. You can also determine how many layers, from the end, to leave unfrozen with the ```--lock-text-unlocked-layers``` parameter. Here's an example command to train CLIP with the RoBERTa LM that has it's last 10 layers unfrozen:
```bash
python -m open_clip_train.main \
         --train-data="pipe:aws s3 cp s3://s-mas/cc3m/{00000..00329}.tar -" \
         --train-num-samples 3000000 \
         --val-data="pipe:aws s3 cp s3://s-mas/cc3m/{00330..00331}.tar -" \
         --val-num-samples 10000 \
         --dataset-type webdataset \
         --batch-size 256 \
         --warmup 2000 \
         --epochs 10 \
         --lr 5e-4 \
         --precision amp \
         --workers 6 \
         --model "roberta-ViT-B-32" \
         --lock-text \
         --lock-text-unlocked-layers 10 \
         --name "10_unfrozen" \
         --report-to "tensorboard" \
```

### Loss Curves

When run on a machine with 8 GPUs the command should produce the following training curve for Conceptual Captions:

![CLIP zero shot training curve](https://raw.githubusercontent.com/mlfoundations/open_clip/main/docs/clip_zeroshot.png)

More detailed curves for Conceptual Captions are given at [/docs/clip_conceptual_captions.md](/docs/clip_conceptual_captions.md).

When training a RN50 on YFCC the same hyperparameters as above are used, with the exception of `lr=5e-4` and `epochs=32`.

Note that to use another model, like `ViT-B/32` or `RN50x4` or `RN50x16` or `ViT-B/16`, specify with `--model RN50x4`.

### Logging

For tensorboard logging, run:
```bash
tensorboard --logdir=logs/tensorboard/ --port=7777
```

For wandb logging, we recommend looking at the `step` variable instead of `Step`, since the later was not properly set in earlier versions of this codebase.
For older runs with models trained before https://github.com/mlfoundations/open_clip/pull/613, the `Step` variable should be ignored.
For newer runs, after that PR, the two variables are the same.

## Evaluation / Zero-Shot

We recommend https://github.com/LAION-AI/CLIP_benchmark#how-to-use for systematic evaluation on 40 datasets.

### Evaluating local checkpoint:

```bash
python -m open_clip_train.main \
    --val-data="/path/to/validation_data.csv"  \
    --model RN101 \
    --pretrained /path/to/checkpoints/epoch_K.pt
```

### Evaluating hosted pretrained checkpoint on ImageNet zero-shot prediction:

```bash
python -m open_clip_train.main \
    --imagenet-val /path/to/imagenet/validation \
    --model ViT-B-32-quickgelu \
    --pretrained laion400m_e32
```

### Model distillation

You can distill from a pre-trained by using `--distill-model` and `--distill-pretrained` to specify the model you'd like to distill from.
For instance, to distill from OpenAI ViT-L/14 use `--distill-model ViT-L-14 --distill-pretrained openai`.

### Gradient accumulation

To simulate larger batches use `--accum-freq k`. If per gpu batch size, `--batch-size`, is `m`, then the effective batch size will be `k * m * num_gpus`.

When increasing `--accum-freq` from its default of 1, samples/s will remain approximately constant (batch size will double, as will time-per-batch). It is recommended to use other features to reduce batch size such as `--grad-checkpointing --local-loss --gather-with-grad` before increasing `--accum-freq`. `--accum-freq` can be used in addition to these features.

Instead of 1 forward pass per example, there are now 2 forward passes per-example. However, the first is done with `torch.no_grad`.

There is some additional GPU memory required --- the features and data from all `m` batches are stored in memory.

There are also `m` loss computations instead of the usual 1.

For more information see Cui et al. (https://arxiv.org/abs/2112.09331) or Pham et al. (https://arxiv.org/abs/2111.10050).

### Int8 Support

We have beta support for int8 training and inference.
You can enable int8 training with `--use-bnb-linear SwitchBackLinearGlobal` or `--use-bnb-linear SwitchBackLinearGlobalMemEfficient`.
Please see the bitsandbytes library for definitions for these layers.
For CLIP VIT-Huge this should currently correspond to a 10% training speedup with no accuracy loss.
More speedups comin when the attention layer is refactored so that linear layers man be replaced there, too.

See the tutorial https://github.com/mlfoundations/open_clip/blob/main/tutorials/int8_tutorial.ipynb or [paper](https://arxiv.org/abs/2304.13013).

### Support for remote loading/training

It is always possible to resume directly from a remote file, e.g., a file in an s3 bucket. Just set `--resume s3://<path-to-checkpoint> `.
This will work with any filesystem supported by `fsspec`.

It is also possible to train `open_clip` models while continuously backing up to s3. This can help to avoid slow local file systems.

Say that your node has a local ssd `/scratch`, an s3 bucket `s3://<path-to-bucket>`.

In that case, set `--logs /scratch` and `--remote-sync s3://<path-to-bucket>`. Then, a background process will sync `/scratch/<run-name>` to `s3://<path-to-bucket>/<run-name>`. After syncing, the background process will sleep for `--remote-sync-frequency` seconds, which defaults to 5 minutes.

There is also experimental support for syncing to other remote file systems, not just s3. To do so, specify `--remote-sync-protocol fsspec`. However, this is currently very slow and not recommended.

Also, to optionally avoid saving too many checkpoints locally when using these features, you can use `--delete-previous-checkpoint` which deletes the previous checkpoint after saving a new one.

Note: if you are using this feature with `--resume latest`, there are a few warnings. First, use with `--save-most-recent` is not supported. Second, only `s3` is supported. Finally, since the sync happens in the background, it is possible that the most recent checkpoint may not be finished syncing to the remote.

### Pushing Models to Hugging Face Hub

The module `open_clip.push_to_hf_hub` includes helpers for pushing models /w weights and config to the HF Hub.

The tool can be run from command line, ex:
`python -m open_clip.push_to_hf_hub --model convnext_large_d_320 --pretrained /train/checkpoints/epoch_12.pt --repo-id laion/CLIP-convnext_large_d_320.laion2B-s29B-b131K-ft`



## Acknowledgments

We gratefully acknowledge the Gauss Centre for Supercomputing e.V. (www.gauss-centre.eu) for funding this part of work by providing computing time through the John von Neumann Institute for Computing (NIC) on the GCS Supercomputer JUWELS Booster at Jülich Supercomputing Centre (JSC).

## The Team

Current development of this repository is led by [Ross Wightman](https://rwightman.com/), [Romain Beaumont](https://github.com/rom1504), [Cade Gordon](http://cadegordon.io/), and [Vaishaal Shankar](http://vaishaal.com/).

The original version of this repository is from a group of researchers at UW, Google, Stanford, Amazon, Columbia, and Berkeley.

[Gabriel Ilharco*](http://gabrielilharco.com/), [Mitchell Wortsman*](https://mitchellnw.github.io/), [Nicholas Carlini](https://nicholas.carlini.com/), [Rohan Taori](https://www.rohantaori.com/), [Achal Dave](http://www.achaldave.com/), [Vaishaal Shankar](http://vaishaal.com/), [John Miller](https://people.eecs.berkeley.edu/~miller_john/), [Hongseok Namkoong](https://hsnamkoong.github.io/), [Hannaneh Hajishirzi](https://homes.cs.washington.edu/~hannaneh/), [Ali Farhadi](https://homes.cs.washington.edu/~ali/), [Ludwig Schmidt](https://people.csail.mit.edu/ludwigs/)

Special thanks to [Jong Wook Kim](https://jongwook.kim/) and [Alec Radford](https://github.com/Newmu) for help with reproducing CLIP!

## Citing

If you found this repository useful, please consider citing:
```bibtex
@software{ilharco_gabriel_2021_5143773,
  author       = {Ilharco, Gabriel and
                  Wortsman, Mitchell and
                  Wightman, Ross and
                  Gordon, Cade and
                  Carlini, Nicholas and
                  Taori, Rohan and
                  Dave, Achal and
                  Shankar, Vaishaal and
                  Namkoong, Hongseok and
                  Miller, John and
                  Hajishirzi, Hannaneh and
                  Farhadi, Ali and
                  Schmidt, Ludwig},
  title        = {OpenCLIP},
  month        = jul,
  year         = 2021,
  note         = {If you use this software, please cite it as below.},
  publisher    = {Zenodo},
  version      = {0.1},
  doi          = {10.5281/zenodo.5143773},
  url          = {https://doi.org/10.5281/zenodo.5143773}
}
```

```bibtex
@inproceedings{cherti2023reproducible,
  title={Reproducible scaling laws for contrastive language-image learning},
  author={Cherti, Mehdi and Beaumont, Romain and Wightman, Ross and Wortsman, Mitchell and Ilharco, Gabriel and Gordon, Cade and Schuhmann, Christoph and Schmidt, Ludwig and Jitsev, Jenia},
  booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
  pages={2818--2829},
  year={2023}
}
```

```bibtex
@inproceedings{Radford2021LearningTV,
  title={Learning Transferable Visual Models From Natural Language Supervision},
  author={Alec Radford and Jong Wook Kim and Chris Hallacy and A. Ramesh and Gabriel Goh and Sandhini Agarwal and Girish Sastry and Amanda Askell and Pamela Mishkin and Jack Clark and Gretchen Krueger and Ilya Sutskever},
  booktitle={ICML},
  year={2021}
}
```

```bibtex
@inproceedings{schuhmann2022laionb,
  title={{LAION}-5B: An open large-scale dataset for training next generation image-text models},
  author={Christoph Schuhmann and
          Romain Beaumont and
          Richard Vencu and
          Cade W Gordon and
          Ross Wightman and
          Mehdi Cherti and
          Theo Coombes and
          Aarush Katta and
          Clayton Mullis and
          Mitchell Wortsman and
          Patrick Schramowski and
          Srivatsa R Kundurthy and
          Katherine Crowson and
          Ludwig Schmidt and
          Robert Kaczmarczyk and
          Jenia Jitsev},
  booktitle={Thirty-sixth Conference on Neural Information Processing Systems Datasets and Benchmarks Track},
  year={2022},
  url={https://openreview.net/forum?id=M3Y74vmsMcY}
}
```

[![DOI](https://zenodo.org/badge/390536799.svg)](https://zenodo.org/badge/latestdoi/390536799)


================================================
FILE: docs/Interacting_with_open_clip.ipynb
================================================
{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/gist/rwightman/12a6526daf2e57f994295b2cce367ac3/interacting-with-clip.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YPHN7PJgKOzb"
      },
      "source": [
        "# Interacting with open_clip\n",
        "\n",
        "This is a self-contained notebook that shows how to download and run open_clip models, calculate the similarity between arbitrary image and text inputs, and perform zero-shot image classifications."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "z7F87xdw9rBX"
      },
      "source": [
        "## Preparation for colab"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 20,
      "metadata": {
        "id": "ck9qjK8z9rBX"
      },
      "outputs": [],
      "source": [
        "import os\n",
        "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"\""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 21,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "0BpdJkdBssk9",
        "outputId": "514354f7-3d50-4ef9-bbbe-88ecbc382cd9"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
            "Requirement already satisfied: open_clip_torch in /usr/local/lib/python3.9/dist-packages (2.16.2)\n",
            "Requirement already satisfied: matplotlib in /usr/local/lib/python3.9/dist-packages (3.7.1)\n",
            "Requirement already satisfied: torch>=1.9.0 in /usr/local/lib/python3.9/dist-packages (from open_clip_torch) (2.0.0+cu118)\n",
            "Requirement already satisfied: ftfy in /usr/local/lib/python3.9/dist-packages (from open_clip_torch) (6.1.1)\n",
            "Requirement already satisfied: timm in /usr/local/lib/python3.9/dist-packages (from open_clip_torch) (0.6.13)\n",
            "Requirement already satisfied: huggingface-hub in /usr/local/lib/python3.9/dist-packages (from open_clip_torch) (0.13.4)\n",
            "Requirement already satisfied: protobuf<4 in /usr/local/lib/python3.9/dist-packages (from open_clip_torch) (3.20.3)\n",
            "Requirement already satisfied: tqdm in /usr/local/lib/python3.9/dist-packages (from open_clip_torch) (4.65.0)\n",
            "Requirement already satisfied: regex in /usr/local/lib/python3.9/dist-packages (from open_clip_torch) (2022.10.31)\n",
            "Requirement already satisfied: sentencepiece in /usr/local/lib/python3.9/dist-packages (from open_clip_torch) (0.1.98)\n",
            "Requirement already satisfied: torchvision in /usr/local/lib/python3.9/dist-packages (from open_clip_torch) (0.15.1+cu118)\n",
            "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.9/dist-packages (from matplotlib) (23.0)\n",
            "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.9/dist-packages (from matplotlib) (4.39.3)\n",
            "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.9/dist-packages (from matplotlib) (2.8.2)\n",
            "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.9/dist-packages (from matplotlib) (1.4.4)\n",
            "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.9/dist-packages (from matplotlib) (8.4.0)\n",
            "Requirement already satisfied: importlib-resources>=3.2.0 in /usr/local/lib/python3.9/dist-packages (from matplotlib) (5.12.0)\n",
            "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.9/dist-packages (from matplotlib) (3.0.9)\n",
            "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.9/dist-packages (from matplotlib) (1.0.7)\n",
            "Requirement already satisfied: numpy>=1.20 in /usr/local/lib/python3.9/dist-packages (from matplotlib) (1.22.4)\n",
            "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.9/dist-packages (from matplotlib) (0.11.0)\n",
            "Requirement already satisfied: zipp>=3.1.0 in /usr/local/lib/python3.9/dist-packages (from importlib-resources>=3.2.0->matplotlib) (3.15.0)\n",
            "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.9/dist-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n",
            "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.9/dist-packages (from torch>=1.9.0->open_clip_torch) (4.5.0)\n",
            "Requirement already satisfied: jinja2 in /usr/local/lib/python3.9/dist-packages (from torch>=1.9.0->open_clip_torch) (3.1.2)\n",
            "Requirement already satisfied: sympy in /usr/local/lib/python3.9/dist-packages (from torch>=1.9.0->open_clip_torch) (1.11.1)\n",
            "Requirement already satisfied: triton==2.0.0 in /usr/local/lib/python3.9/dist-packages (from torch>=1.9.0->open_clip_torch) (2.0.0)\n",
            "Requirement already satisfied: networkx in /usr/local/lib/python3.9/dist-packages (from torch>=1.9.0->open_clip_torch) (3.1)\n",
            "Requirement already satisfied: filelock in /usr/local/lib/python3.9/dist-packages (from torch>=1.9.0->open_clip_torch) (3.11.0)\n",
            "Requirement already satisfied: lit in /usr/local/lib/python3.9/dist-packages (from triton==2.0.0->torch>=1.9.0->open_clip_torch) (16.0.1)\n",
            "Requirement already satisfied: cmake in /usr/local/lib/python3.9/dist-packages (from triton==2.0.0->torch>=1.9.0->open_clip_torch) (3.25.2)\n",
            "Requirement already satisfied: wcwidth>=0.2.5 in /usr/local/lib/python3.9/dist-packages (from ftfy->open_clip_torch) (0.2.6)\n",
            "Requirement already satisfied: requests in /usr/local/lib/python3.9/dist-packages (from huggingface-hub->open_clip_torch) (2.27.1)\n",
            "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.9/dist-packages (from huggingface-hub->open_clip_torch) (6.0)\n",
            "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.9/dist-packages (from jinja2->torch>=1.9.0->open_clip_torch) (2.1.2)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.9/dist-packages (from requests->huggingface-hub->open_clip_torch) (2022.12.7)\n",
            "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.9/dist-packages (from requests->huggingface-hub->open_clip_torch) (1.26.15)\n",
            "Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.9/dist-packages (from requests->huggingface-hub->open_clip_torch) (2.0.12)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.9/dist-packages (from requests->huggingface-hub->open_clip_torch) (3.4)\n",
            "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.9/dist-packages (from sympy->torch>=1.9.0->open_clip_torch) (1.3.0)\n"
          ]
        }
      ],
      "source": [
        "! pip install open_clip_torch matplotlib"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "metadata": {
        "id": "C1hkDT38hSaP"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import torch"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "eFxgLV5HAEEw"
      },
      "source": [
        "# Loading the model\n",
        "\n",
        "`clip.available_models()` will list the names of available CLIP models."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 23,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "uLFS29hnhlY4",
        "outputId": "c1cb8995-d525-4f81-fd96-eaba02a2e48e"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[('RN50', 'openai'),\n",
              " ('RN50', 'yfcc15m'),\n",
              " ('RN50', 'cc12m'),\n",
              " ('RN50-quickgelu', 'openai'),\n",
              " ('RN50-quickgelu', 'yfcc15m'),\n",
              " ('RN50-quickgelu', 'cc12m'),\n",
              " ('RN101', 'openai'),\n",
              " ('RN101', 'yfcc15m'),\n",
              " ('RN101-quickgelu', 'openai'),\n",
              " ('RN101-quickgelu', 'yfcc15m'),\n",
              " ('RN50x4', 'openai'),\n",
              " ('RN50x16', 'openai'),\n",
              " ('RN50x64', 'openai'),\n",
              " ('ViT-B-32', 'openai'),\n",
              " ('ViT-B-32', 'laion400m_e31'),\n",
              " ('ViT-B-32', 'laion400m_e32'),\n",
              " ('ViT-B-32', 'laion2b_e16'),\n",
              " ('ViT-B-32', 'laion2b_s34b_b79k'),\n",
              " ('ViT-B-32-quickgelu', 'openai'),\n",
              " ('ViT-B-32-quickgelu', 'laion400m_e31'),\n",
              " ('ViT-B-32-quickgelu', 'laion400m_e32'),\n",
              " ('ViT-B-16', 'openai'),\n",
              " ('ViT-B-16', 'laion400m_e31'),\n",
              " ('ViT-B-16', 'laion400m_e32'),\n",
              " ('ViT-B-16', 'laion2b_s34b_b88k'),\n",
              " ('ViT-B-16-plus-240', 'laion400m_e31'),\n",
              " ('ViT-B-16-plus-240', 'laion400m_e32'),\n",
              " ('ViT-L-14', 'openai'),\n",
              " ('ViT-L-14', 'laion400m_e31'),\n",
              " ('ViT-L-14', 'laion400m_e32'),\n",
              " ('ViT-L-14', 'laion2b_s32b_b82k'),\n",
              " ('ViT-L-14-336', 'openai'),\n",
              " ('ViT-H-14', 'laion2b_s32b_b79k'),\n",
              " ('ViT-g-14', 'laion2b_s12b_b42k'),\n",
              " ('ViT-g-14', 'laion2b_s34b_b88k'),\n",
              " ('ViT-bigG-14', 'laion2b_s39b_b160k'),\n",
              " ('roberta-ViT-B-32', 'laion2b_s12b_b32k'),\n",
              " ('xlm-roberta-base-ViT-B-32', 'laion5b_s13b_b90k'),\n",
              " ('xlm-roberta-large-ViT-H-14', 'frozen_laion5b_s13b_b90k'),\n",
              " ('convnext_base', 'laion400m_s13b_b51k'),\n",
              " ('convnext_base_w', 'laion2b_s13b_b82k'),\n",
              " ('convnext_base_w', 'laion2b_s13b_b82k_augreg'),\n",
              " ('convnext_base_w', 'laion_aesthetic_s13b_b82k'),\n",
              " ('convnext_base_w_320', 'laion_aesthetic_s13b_b82k'),\n",
              " ('convnext_base_w_320', 'laion_aesthetic_s13b_b82k_augreg'),\n",
              " ('convnext_large_d', 'laion2b_s26b_b102k_augreg'),\n",
              " ('convnext_large_d_320', 'laion2b_s29b_b131k_ft'),\n",
              " ('convnext_large_d_320', 'laion2b_s29b_b131k_ft_soup'),\n",
              " ('convnext_xxlarge', 'laion2b_s34b_b82k_augreg'),\n",
              " ('convnext_xxlarge', 'laion2b_s34b_b82k_augreg_rewind'),\n",
              " ('convnext_xxlarge', 'laion2b_s34b_b82k_augreg_soup'),\n",
              " ('coca_ViT-B-32', 'laion2b_s13b_b90k'),\n",
              " ('coca_ViT-B-32', 'mscoco_finetuned_laion2b_s13b_b90k'),\n",
              " ('coca_ViT-L-14', 'laion2b_s13b_b90k'),\n",
              " ('coca_ViT-L-14', 'mscoco_finetuned_laion2b_s13b_b90k')]"
            ]
          },
          "metadata": {},
          "execution_count": 23
        }
      ],
      "source": [
        "import open_clip\n",
        "open_clip.list_pretrained()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 24,
      "metadata": {
        "id": "8pAHe7nD9rBa"
      },
      "outputs": [],
      "source": [
        "model, _, preprocess = open_clip.create_model_and_transforms('convnext_base_w', pretrained='laion2b_s13b_b82k_augreg')\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 25,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "IBRVTY9lbGm8",
        "outputId": "7fc2f6c9-d7c1-4fe4-fda9-dfd372d03834"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Model parameters: 179,385,345\n",
            "Context length: 77\n",
            "Vocab size: 49408\n"
          ]
        }
      ],
      "source": [
        "model.eval()\n",
        "context_length = model.context_length\n",
        "vocab_size = model.vocab_size\n",
        "\n",
        "print(\"Model parameters:\", f\"{np.sum([int(np.prod(p.shape)) for p in model.parameters()]):,}\")\n",
        "print(\"Context length:\", context_length)\n",
        "print(\"Vocab size:\", vocab_size)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "21slhZGCqANb"
      },
      "source": [
        "# Image Preprocessing\n",
        "\n",
        "We resize the input images and center-crop them to conform with the image resolution that the model expects. Before doing so, we will normalize the pixel intensity using the dataset mean and standard deviation.\n",
        "\n",
        "The second return value from `clip.load()` contains a torchvision `Transform` that performs this preprocessing.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 26,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "d6cpiIFHp9N6",
        "outputId": "84943ad9-0b1a-4200-946d-a8fb164ec0b0"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Compose(\n",
              "    Resize(size=256, interpolation=bicubic, max_size=None, antialias=warn)\n",
              "    CenterCrop(size=(256, 256))\n",
              "    <function _convert_to_rgb at 0x7fac58819c10>\n",
              "    ToTensor()\n",
              "    Normalize(mean=(0.48145466, 0.4578275, 0.40821073), std=(0.26862954, 0.26130258, 0.27577711))\n",
              ")"
            ]
          },
          "metadata": {},
          "execution_count": 26
        }
      ],
      "source": [
        "preprocess"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "xwSB5jZki3Cj"
      },
      "source": [
        "# Text Preprocessing\n",
        "\n",
        "We use a case-insensitive tokenizer, which can be invoked using `tokenizer.tokenize()`. By default, the outputs are padded to become 77 tokens long, which is what the CLIP models expects."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 27,
      "metadata": {
        "id": "8f9coA_O9rBb"
      },
      "outputs": [],
      "source": [
        "from open_clip import tokenizer"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 28,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "qGom156-i2kL",
        "outputId": "f4b4f532-f8ea-424f-d878-8cd014dad5e4"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "tensor([[49406,  3306,  1002,   256, 49407,     0,     0,     0,     0,     0,\n",
              "             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
              "             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
              "             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
              "             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
              "             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
              "             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
              "             0,     0,     0,     0,     0,     0,     0]])"
            ]
          },
          "metadata": {},
          "execution_count": 28
        }
      ],
      "source": [
        "tokenizer.tokenize(\"Hello World!\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4W8ARJVqBJXs"
      },
      "source": [
        "# Setting up input images and texts\n",
        "\n",
        "We are going to feed 8 example images and their textual descriptions to the model, and compare the similarity between the corresponding features.\n",
        "\n",
        "The tokenizer is case-insensitive, and we can freely give any suitable textual descriptions."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 29,
      "metadata": {
        "id": "tMc1AXzBlhzm"
      },
      "outputs": [],
      "source": [
        "import os\n",
        "import skimage\n",
        "import IPython.display\n",
        "import matplotlib.pyplot as plt\n",
        "from PIL import Image\n",
        "import numpy as np\n",
        "\n",
        "from collections import OrderedDict\n",
        "import torch\n",
        "\n",
        "%matplotlib inline\n",
        "%config InlineBackend.figure_format = 'retina'\n",
        "\n",
        "# images in skimage to use and their textual descriptions\n",
        "descriptions = {\n",
        "    \"page\": \"a page of text about segmentation\",\n",
        "    \"chelsea\": \"a facial photo of a tabby cat\",\n",
        "    \"astronaut\": \"a portrait of an astronaut with the American flag\",\n",
        "    \"rocket\": \"a rocket standing on a launchpad\",\n",
        "    \"motorcycle_right\": \"a red motorcycle standing in a garage\",\n",
        "    \"camera\": \"a person looking at a camera on a tripod\",\n",
        "    \"horse\": \"a black-and-white silhouette of a horse\", \n",
        "    \"coffee\": \"a cup of coffee on a saucer\"\n",
        "}"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 30,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 504
        },
        "id": "NSSrLY185jSf",
        "outputId": "d057493e-01e1-4673-b549-0cb8a0a6b2d2"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1600x500 with 8 Axes>"
            ],
            "image/png": "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heXU5cuXax1Uf+HCBfz000/889ixY9WGE87ev2HDBo3x5eXlYcKECRq/FzLUsXr58qXkfLu2vmSVKlXCiBEjABTWswcHB+uceEipoKBA7Vv5hGXlLVu2aD2XL168qHVflyXG6jeoL0P1DczPz8eYMWMknXeGKhO8ac8eYkTMQD799FMGgAFg5cqVY//++69KmAMHDjAPDw8GgNna2vLw69atK/H2lXHp8xPXrVsnWi84OJg9fPhQbdiCggJ24sQJ9v777zNra2v28uVLlTA3b95klpaWPL6AgAAWHx8vCpOVlcUmT57MADALCwsetl27dnr9XnVCQkL02qft2rXj4Q8fPqwzvJeXFw//4MEDtWHef/99HsbMzIwtW7aM5efni8LcuXOHNW3alIdzcHDQGN/Tp095OCsrK43HR+ju3bvMzs6Or9eiRQt27949UZj8/Hy2ePFiZmpqysONHz9eY5zFOb+WL18uWm/IkCEsLi5Obdjo6Gj20UcfsX379umM98svvxTFq9zXz549k5SuP//8kykUCr5uhw4dWExMjNqwDx48YDNnzmQbNmxQ+U54/YSEhGjcnvC8tLCwYF9//bXa64cxxl6/fs127drF+vTpw5o2bSrp96izbt06Vr16dfbtt99qPLeysrLY0qVLRfvi5MmTKuG2bt3Kv/fz82PZ2dlat71v3z4eXqFQsO+++47l5eWJwty5c4e1atVK5V6oaT9K3ddKDx484OG9vLw0/n4fHx8erkqVKiwqKkol3KZNm5iVlZXofqXtOpByn9D33jN79mwefvbs2WrD/Pfff6L0jRw5kqWlpYnCvHz5ko0aNYoBEN2rpexTXaTcf6X8DqHDhw/L9owwxHmpj1WrVomOz9SpU1WupefPn7NevXqpHB91+yolJYXZ2NjwMMOHD2epqamiMGlpaWz06NEqv0fTNSHluikqPz+fVapUia/XuXNn9vjxY1GYrKwsNnPmTJV0aLuOgoKCeBhra2u2ZcsWlTCXL19mtWrVUtlfmq6pa9euiZ6NzZo1U3vNK926dYt9/vnnzN3dnf3555+S9gchpGwxdvlMn/xLixYteNhGjRqxmzdvir7Pz89ny5YtY+bm5szU1JRZWVnpzG+UZp7XEOnXN7+ki/D5Y2FhofH5curUKebp6cnD1q1bV2P+1xB5upMnT4rKaL1792YJCQmi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
Download .txt
gitextract_6ui6sr19/

├── .gitattributes
├── .github/
│   └── workflows/
│       ├── ci.yml
│       ├── clear-cache.yml
│       └── python-publish.yml
├── .gitignore
├── CITATION.cff
├── HISTORY.md
├── LICENSE
├── MANIFEST.in
├── Makefile
├── README.md
├── docs/
│   ├── Interacting_with_open_clip.ipynb
│   ├── Interacting_with_open_coca.ipynb
│   ├── LOW_ACC.md
│   ├── PRETRAINED.md
│   ├── clip_conceptual_captions.md
│   ├── clipa.md
│   ├── datacomp_models.md
│   ├── model_profile.csv
│   ├── openclip_classification_results.csv
│   ├── openclip_multilingual_retrieval_results.csv
│   ├── openclip_results.csv
│   ├── openclip_retrieval_results.csv
│   └── script_examples/
│       ├── clipa/
│       │   ├── vit_b16/
│       │   │   ├── i50_t16_finetune.sh
│       │   │   └── i50_t16_pretrain.sh
│       │   └── vit_l16/
│       │       ├── i17_t16_finetune.sh
│       │       ├── i17_t16_pretrain.sh
│       │       ├── i37_t8_finetune.sh
│       │       └── i37_t8_pretrain.sh
│       ├── clipav2/
│       │   └── vit_h14/
│       │       ├── i257_t32_finetunex4.sh
│       │       ├── i50_t8_pretrain.sh
│       │       └── i577_t32_finetunex1.sh
│       └── stability_example.sh
├── pyproject.toml
├── pytest.ini
├── requirements-test.txt
├── requirements-training.txt
├── requirements.txt
├── scripts/
│   ├── clipav1_vit_l16_i37_t8.sh
│   ├── clipav2_vit_h14_i84_224_336_cl32_gap_datacomp1b.sh
│   ├── h14_224_32_finetune.sh
│   └── h14_84_8_pretrain.sh
├── src/
│   ├── open_clip/
│   │   ├── __init__.py
│   │   ├── coca_model.py
│   │   ├── constants.py
│   │   ├── convert.py
│   │   ├── factory.py
│   │   ├── hf_configs.py
│   │   ├── hf_model.py
│   │   ├── loss.py
│   │   ├── model.py
│   │   ├── model_configs/
│   │   │   ├── EVA01-g-14-plus.json
│   │   │   ├── EVA01-g-14.json
│   │   │   ├── EVA02-B-16.json
│   │   │   ├── EVA02-E-14-plus.json
│   │   │   ├── EVA02-E-14.json
│   │   │   ├── EVA02-L-14-336.json
│   │   │   ├── EVA02-L-14.json
│   │   │   ├── MobileCLIP-B.json
│   │   │   ├── MobileCLIP-S1.json
│   │   │   ├── MobileCLIP-S2.json
│   │   │   ├── MobileCLIP2-B.json
│   │   │   ├── MobileCLIP2-L-14.json
│   │   │   ├── MobileCLIP2-S0.json
│   │   │   ├── MobileCLIP2-S2.json
│   │   │   ├── MobileCLIP2-S3.json
│   │   │   ├── MobileCLIP2-S4.json
│   │   │   ├── PE-Core-B-16.json
│   │   │   ├── PE-Core-L-14-336.json
│   │   │   ├── PE-Core-S-16-384.json
│   │   │   ├── PE-Core-T-16-384.json
│   │   │   ├── PE-Core-bigG-14-448.json
│   │   │   ├── RN101-quickgelu.json
│   │   │   ├── RN101.json
│   │   │   ├── RN50-quickgelu.json
│   │   │   ├── RN50.json
│   │   │   ├── RN50x16-quickgelu.json
│   │   │   ├── RN50x16.json
│   │   │   ├── RN50x4-quickgelu.json
│   │   │   ├── RN50x4.json
│   │   │   ├── RN50x64-quickgelu.json
│   │   │   ├── RN50x64.json
│   │   │   ├── ViT-B-16-SigLIP-256.json
│   │   │   ├── ViT-B-16-SigLIP-384.json
│   │   │   ├── ViT-B-16-SigLIP-512.json
│   │   │   ├── ViT-B-16-SigLIP-i18n-256.json
│   │   │   ├── ViT-B-16-SigLIP.json
│   │   │   ├── ViT-B-16-SigLIP2-256.json
│   │   │   ├── ViT-B-16-SigLIP2-384.json
│   │   │   ├── ViT-B-16-SigLIP2-512.json
│   │   │   ├── ViT-B-16-SigLIP2.json
│   │   │   ├── ViT-B-16-plus-240.json
│   │   │   ├── ViT-B-16-plus.json
│   │   │   ├── ViT-B-16-quickgelu.json
│   │   │   ├── ViT-B-16.json
│   │   │   ├── ViT-B-32-256.json
│   │   │   ├── ViT-B-32-SigLIP2-256.json
│   │   │   ├── ViT-B-32-plus-256.json
│   │   │   ├── ViT-B-32-quickgelu.json
│   │   │   ├── ViT-B-32.json
│   │   │   ├── ViT-H-14-378-quickgelu.json
│   │   │   ├── ViT-H-14-378.json
│   │   │   ├── ViT-H-14-CLIPA-336.json
│   │   │   ├── ViT-H-14-CLIPA.json
│   │   │   ├── ViT-H-14-quickgelu.json
│   │   │   ├── ViT-H-14-worldwide-378.json
│   │   │   ├── ViT-H-14-worldwide-quickgelu.json
│   │   │   ├── ViT-H-14-worldwide.json
│   │   │   ├── ViT-H-14.json
│   │   │   ├── ViT-H-16.json
│   │   │   ├── ViT-L-14-280.json
│   │   │   ├── ViT-L-14-336-quickgelu.json
│   │   │   ├── ViT-L-14-336.json
│   │   │   ├── ViT-L-14-CLIPA-336.json
│   │   │   ├── ViT-L-14-CLIPA.json
│   │   │   ├── ViT-L-14-quickgelu.json
│   │   │   ├── ViT-L-14-worldwide-quickgelu.json
│   │   │   ├── ViT-L-14-worldwide.json
│   │   │   ├── ViT-L-14.json
│   │   │   ├── ViT-L-16-320.json
│   │   │   ├── ViT-L-16-SigLIP-256.json
│   │   │   ├── ViT-L-16-SigLIP-384.json
│   │   │   ├── ViT-L-16-SigLIP2-256.json
│   │   │   ├── ViT-L-16-SigLIP2-384.json
│   │   │   ├── ViT-L-16-SigLIP2-512.json
│   │   │   ├── ViT-L-16.json
│   │   │   ├── ViT-M-16-alt.json
│   │   │   ├── ViT-M-16.json
│   │   │   ├── ViT-M-32-alt.json
│   │   │   ├── ViT-M-32.json
│   │   │   ├── ViT-S-16-alt.json
│   │   │   ├── ViT-S-16.json
│   │   │   ├── ViT-S-32-alt.json
│   │   │   ├── ViT-S-32.json
│   │   │   ├── ViT-SO400M-14-SigLIP-378.json
│   │   │   ├── ViT-SO400M-14-SigLIP-384.json
│   │   │   ├── ViT-SO400M-14-SigLIP.json
│   │   │   ├── ViT-SO400M-14-SigLIP2-378.json
│   │   │   ├── ViT-SO400M-14-SigLIP2.json
│   │   │   ├── ViT-SO400M-16-SigLIP-i18n-256.json
│   │   │   ├── ViT-SO400M-16-SigLIP2-256.json
│   │   │   ├── ViT-SO400M-16-SigLIP2-384.json
│   │   │   ├── ViT-SO400M-16-SigLIP2-512.json
│   │   │   ├── ViT-bigG-14-CLIPA-336.json
│   │   │   ├── ViT-bigG-14-CLIPA.json
│   │   │   ├── ViT-bigG-14-quickgelu.json
│   │   │   ├── ViT-bigG-14-worldwide-378.json
│   │   │   ├── ViT-bigG-14-worldwide.json
│   │   │   ├── ViT-bigG-14.json
│   │   │   ├── ViT-e-14.json
│   │   │   ├── ViT-g-14.json
│   │   │   ├── ViT-gopt-16-SigLIP2-256.json
│   │   │   ├── ViT-gopt-16-SigLIP2-384.json
│   │   │   ├── ViTamin-B-LTT.json
│   │   │   ├── ViTamin-B.json
│   │   │   ├── ViTamin-L-256.json
│   │   │   ├── ViTamin-L-336.json
│   │   │   ├── ViTamin-L-384.json
│   │   │   ├── ViTamin-L.json
│   │   │   ├── ViTamin-L2-256.json
│   │   │   ├── ViTamin-L2-336.json
│   │   │   ├── ViTamin-L2-384.json
│   │   │   ├── ViTamin-L2.json
│   │   │   ├── ViTamin-S-LTT.json
│   │   │   ├── ViTamin-S.json
│   │   │   ├── ViTamin-XL-256.json
│   │   │   ├── ViTamin-XL-336.json
│   │   │   ├── ViTamin-XL-384.json
│   │   │   ├── coca_ViT-B-32.json
│   │   │   ├── coca_ViT-L-14.json
│   │   │   ├── coca_base.json
│   │   │   ├── coca_roberta-ViT-B-32.json
│   │   │   ├── convnext_base.json
│   │   │   ├── convnext_base_w.json
│   │   │   ├── convnext_base_w_320.json
│   │   │   ├── convnext_large.json
│   │   │   ├── convnext_large_d.json
│   │   │   ├── convnext_large_d_320.json
│   │   │   ├── convnext_small.json
│   │   │   ├── convnext_tiny.json
│   │   │   ├── convnext_xlarge.json
│   │   │   ├── convnext_xxlarge.json
│   │   │   ├── convnext_xxlarge_320.json
│   │   │   ├── mt5-base-ViT-B-32.json
│   │   │   ├── mt5-xl-ViT-H-14.json
│   │   │   ├── nllb-clip-base-siglip.json
│   │   │   ├── nllb-clip-base.json
│   │   │   ├── nllb-clip-large-siglip.json
│   │   │   ├── nllb-clip-large.json
│   │   │   ├── roberta-ViT-B-32.json
│   │   │   ├── swin_base_patch4_window7_224.json
│   │   │   ├── vit_medium_patch16_gap_256.json
│   │   │   ├── vit_relpos_medium_patch16_cls_224.json
│   │   │   ├── xlm-roberta-base-ViT-B-32.json
│   │   │   └── xlm-roberta-large-ViT-H-14.json
│   │   ├── modified_resnet.py
│   │   ├── openai.py
│   │   ├── pos_embed.py
│   │   ├── pretrained.py
│   │   ├── push_to_hf_hub.py
│   │   ├── timm_model.py
│   │   ├── tokenizer.py
│   │   ├── transform.py
│   │   ├── transformer.py
│   │   ├── utils.py
│   │   ├── version.py
│   │   ├── zero_shot_classifier.py
│   │   └── zero_shot_metadata.py
│   └── open_clip_train/
│       ├── __init__.py
│       ├── data.py
│       ├── distributed.py
│       ├── file_utils.py
│       ├── logger.py
│       ├── main.py
│       ├── params.py
│       ├── precision.py
│       ├── profiler.py
│       ├── scheduler.py
│       ├── train.py
│       └── zero_shot.py
├── tests/
│   ├── test_download_pretrained.py
│   ├── test_hf_model.py
│   ├── test_inference.py
│   ├── test_inference_simple.py
│   ├── test_num_shards.py
│   ├── test_training_simple.py
│   ├── test_wds.py
│   └── util_test.py
└── tutorials/
    └── int8_tutorial.ipynb
Download .txt
SYMBOL INDEX (455 symbols across 36 files)

FILE: src/open_clip/coca_model.py
  class MultimodalCfg (line 51) | class MultimodalCfg(CLIPTextCfg):
  function _build_text_decoder_tower (line 59) | def _build_text_decoder_tower(
  function _token_to_tensor (line 85) | def _token_to_tensor(token_id, device: str = "cpu") -> torch.Tensor:
  class CoCa (line 93) | class CoCa(nn.Module):
    method __init__ (line 94) | def __init__(
    method set_grad_checkpointing (line 150) | def set_grad_checkpointing(self, enable: bool = True):
    method _encode_image (line 155) | def _encode_image(self, images, normalize: bool = True):
    method _encode_text (line 160) | def _encode_text(self, text, normalize: bool = True):
    method encode_image (line 165) | def encode_image(self, images, normalize: bool = True):
    method encode_text (line 169) | def encode_text(self, text, normalize: bool = True):
    method forward_intermediates (line 173) | def forward_intermediates(
    method forward (line 255) | def forward(
    method generate (line 290) | def generate(
    method _generate_beamsearch (line 417) | def _generate_beamsearch(
  function prepare_inputs_for_generation (line 567) | def prepare_inputs_for_generation(input_ids, image_inputs, past=None, **...

FILE: src/open_clip/convert.py
  function load_big_vision_weights (line 13) | def load_big_vision_weights(model: CustomTextCLIP, checkpoint_path: str):
  function convert_mobile_clip_state_dict (line 158) | def convert_mobile_clip_state_dict(model: CustomTextCLIP, state_dict, fa...
  function convert_state_dict (line 199) | def convert_state_dict(model: Union[CustomTextCLIP, CLIP], state_dict):

FILE: src/open_clip/factory.py
  function _natural_key (line 28) | def _natural_key(string_):
  function _rescan_model_configs (line 32) | def _rescan_model_configs():
  function list_models (line 56) | def list_models():
  function add_model_config (line 61) | def add_model_config(path):
  function parse_model_name (line 73) | def parse_model_name(model_name: str) -> Tuple[Optional[str], str]:
  function _get_hf_config (line 119) | def _get_hf_config(
  function get_model_config (line 135) | def get_model_config(model_name):
  function load_state_dict (line 153) | def load_state_dict(
  function load_checkpoint (line 181) | def load_checkpoint(
  function _find_checkpoint_in_dir (line 228) | def _find_checkpoint_in_dir(dir_path: Path) -> Optional[str]:
  function create_model (line 251) | def create_model(
  function get_tokenizer (line 628) | def get_tokenizer(
  function _set_model_device_and_precision (line 758) | def _set_model_device_and_precision(
  function create_loss (line 790) | def create_loss(args):
  function create_model_and_transforms (line 829) | def create_model_and_transforms(
  function create_model_from_pretrained (line 968) | def create_model_from_pretrained(

FILE: src/open_clip/hf_model.py
  class BaseModelOutput (line 20) | class BaseModelOutput:
  class PretrainedConfig (line 24) | class PretrainedConfig:
  function _camel2snake (line 31) | def _camel2snake(s):
  function register_pooler (line 39) | def register_pooler(cls):
  class MeanPooler (line 46) | class MeanPooler(nn.Module):
    method forward (line 49) | def forward(self, x: BaseModelOutput, attention_mask: TensorType):
  class MaxPooler (line 55) | class MaxPooler(nn.Module):
    method forward (line 58) | def forward(self, x: BaseModelOutput, attention_mask: TensorType):
  class ClsPooler (line 64) | class ClsPooler(nn.Module):
    method __init__ (line 67) | def __init__(self, use_pooler_output=True):
    method forward (line 72) | def forward(self, x: BaseModelOutput, attention_mask: TensorType):
  class ClsLastHiddenStatePooler (line 83) | class ClsLastHiddenStatePooler(nn.Module):
    method __init__ (line 88) | def __init__(self):
    method forward (line 92) | def forward(self, x: BaseModelOutput, attention_mask: TensorType):
  class HFTextEncoder (line 96) | class HFTextEncoder(nn.Module):
    method __init__ (line 100) | def __init__(
    method forward (line 154) | def forward(self, x: TensorType):
    method lock (line 171) | def lock(self, unlocked_layers: int = 0, freeze_layer_norm: bool = True):
    method set_grad_checkpointing (line 189) | def set_grad_checkpointing(self, enable=True):
    method init_parameters (line 192) | def init_parameters(self):

FILE: src/open_clip/loss.py
  function gather_features (line 21) | def gather_features(
  class ClipLoss (line 68) | class ClipLoss(nn.Module):
    method __init__ (line 70) | def __init__(
    method get_ground_truth (line 91) | def get_ground_truth(self, device, num_logits) -> torch.Tensor:
    method get_logits (line 104) | def get_logits(self, image_features, text_features, logit_scale, logit...
    method forward (line 132) | def forward(
  class CoCaLoss (line 158) | class CoCaLoss(ClipLoss):
    method __init__ (line 159) | def __init__(
    method forward (line 184) | def forward(self, image_features, text_features, logits, labels, logit...
  class DistillClipLoss (line 203) | class DistillClipLoss(ClipLoss):
    method dist_loss (line 205) | def dist_loss(self, teacher_logits, student_logits):
    method forward (line 208) | def forward(
  function neighbour_exchange (line 242) | def neighbour_exchange(from_rank, to_rank, tensor, group=None):
  function neighbour_exchange_bidir (line 262) | def neighbour_exchange_bidir(left_rank, right_rank, tensor_to_left, tens...
  class NeighbourExchange (line 295) | class NeighbourExchange(torch.autograd.Function):
    method forward (line 297) | def forward(ctx, from_rank, to_rank, group, tensor):
    method backward (line 304) | def backward(ctx, grad_output):
  function neighbour_exchange_with_grad (line 308) | def neighbour_exchange_with_grad(from_rank, to_rank, tensor, group=None):
  class NeighbourExchangeBidir (line 312) | class NeighbourExchangeBidir(torch.autograd.Function):
    method forward (line 314) | def forward(ctx, left_rank, right_rank, group, tensor_to_left, tensor_...
    method backward (line 321) | def backward(ctx, *grad_outputs):
  function neighbour_exchange_bidir_with_grad (line 326) | def neighbour_exchange_bidir_with_grad(left_rank, right_rank, tensor_to_...
  class SigLipLoss (line 330) | class SigLipLoss(nn.Module):
    method __init__ (line 340) | def __init__(
    method get_ground_truth (line 358) | def get_ground_truth(self, device, dtype, num_logits, negative_only=Fa...
    method get_logits (line 364) | def get_logits(self, image_features, text_features, logit_scale, logit...
    method _loss (line 370) | def _loss(self, image_features, text_features, logit_scale, logit_bias...
    method forward (line 381) | def forward(self, image_features, text_features, logit_scale, logit_bi...

FILE: src/open_clip/model.py
  class CLIPVisionCfg (line 35) | class CLIPVisionCfg:
  class CLIPTextCfg (line 75) | class CLIPTextCfg:
  function get_cast_dtype (line 115) | def get_cast_dtype(precision: str):
  function get_input_dtype (line 124) | def get_input_dtype(precision: str):
  function _build_vision_tower (line 133) | def _build_vision_tower(
  function _build_text_tower (line 209) | def _build_text_tower(
  class CLIP (line 265) | class CLIP(nn.Module):
    method __init__ (line 268) | def __init__(
    method lock_image_tower (line 304) | def lock_image_tower(self, unlocked_groups=0, freeze_bn_stats=False):
    method lock_text_tower (line 308) | def lock_text_tower(self, unlocked_layers: int = 0, freeze_layer_norm:...
    method set_grad_checkpointing (line 313) | def set_grad_checkpointing(self, enable=True):
    method no_weight_decay (line 318) | def no_weight_decay(self):
    method encode_image (line 326) | def encode_image(self, image, normalize: bool = False):
    method encode_text (line 330) | def encode_text(self, text, normalize: bool = False):
    method get_logits (line 347) | def get_logits(self, image, text):
    method forward_intermediates (line 356) | def forward_intermediates(
    method forward (line 459) | def forward(
  class CustomTextCLIP (line 482) | class CustomTextCLIP(nn.Module):
    method __init__ (line 485) | def __init__(
    method lock_image_tower (line 511) | def lock_image_tower(self, unlocked_groups=0, freeze_bn_stats=False):
    method lock_text_tower (line 515) | def lock_text_tower(self, unlocked_layers: int = 0, freeze_layer_norm:...
    method set_grad_checkpointing (line 519) | def set_grad_checkpointing(self, enable=True):
    method no_weight_decay (line 524) | def no_weight_decay(self):
    method encode_image (line 535) | def encode_image(self, image, normalize: bool = False):
    method encode_text (line 539) | def encode_text(self, text, normalize: bool = False):
    method get_logits (line 543) | def get_logits(self, image, text):
    method forward_intermediates (line 552) | def forward_intermediates(
    method forward (line 642) | def forward(
  function convert_weights_to_lp (line 665) | def convert_weights_to_lp(model: nn.Module, dtype=torch.float16):
  function convert_to_custom_text_state_dict (line 699) | def convert_to_custom_text_state_dict(state_dict: dict):
  function build_model_from_openai_state_dict (line 717) | def build_model_from_openai_state_dict(
  function trace_model (line 776) | def trace_model(model, batch_size=256, device=torch.device('cpu')):
  function resize_pos_embed (line 792) | def resize_pos_embed(state_dict, model, interpolation: str = 'bicubic', ...
  function resize_text_pos_embed (line 826) | def resize_text_pos_embed(state_dict, model, interpolation: str = 'linea...
  function get_model_preprocess_cfg (line 859) | def get_model_preprocess_cfg(model):
  function set_model_preprocess_cfg (line 876) | def set_model_preprocess_cfg(model, preprocess_cfg: Dict[str, Any]):
  function get_model_tokenize_cfg (line 883) | def get_model_tokenize_cfg(model):

FILE: src/open_clip/modified_resnet.py
  class Bottleneck (line 11) | class Bottleneck(nn.Module):
    method __init__ (line 14) | def __init__(self, inplanes, planes, stride=1):
    method forward (line 43) | def forward(self, x: torch.Tensor):
  class AttentionPool2d (line 59) | class AttentionPool2d(nn.Module):
    method __init__ (line 60) | def __init__(self, spacial_dim: int, embed_dim: int, num_heads: int, o...
    method forward (line 69) | def forward(self, x):
  class ModifiedResNet (line 96) | class ModifiedResNet(nn.Module):
    method __init__ (line 104) | def __init__(
    method _make_layer (line 140) | def _make_layer(self, planes, blocks, stride=1):
    method init_parameters (line 149) | def init_parameters(self):
    method lock (line 162) | def lock(self, unlocked_groups=0, freeze_bn_stats=False):
    method set_grad_checkpointing (line 170) | def set_grad_checkpointing(self, enable=True):
    method stem (line 174) | def stem(self, x):
    method forward_intermediates (line 181) | def forward_intermediates(
    method forward (line 228) | def forward(self, x):

FILE: src/open_clip/openai.py
  function list_openai_models (line 19) | def list_openai_models() -> List[str]:
  function load_openai_model (line 24) | def load_openai_model(

FILE: src/open_clip/pos_embed.py
  function get_2d_sincos_pos_embed (line 20) | def get_2d_sincos_pos_embed(embed_dim, grid_size, cls_token=False):
  function get_2d_sincos_pos_embed_from_grid (line 38) | def get_2d_sincos_pos_embed_from_grid(embed_dim, grid):
  function get_1d_sincos_pos_embed_from_grid (line 49) | def get_1d_sincos_pos_embed_from_grid(embed_dim, pos):
  function interpolate_pos_embed (line 75) | def interpolate_pos_embed(model, checkpoint_model):

FILE: src/open_clip/pretrained.py
  function _pcfg (line 40) | def _pcfg(url='', hf_hub='', **kwargs):
  function _slpcfg (line 53) | def _slpcfg(url='', hf_hub='', **kwargs):
  function _apcfg (line 66) | def _apcfg(url='', hf_hub='', **kwargs):
  function _mccfg (line 79) | def _mccfg(url='', hf_hub='', **kwargs):
  function _mc2cfg (line 92) | def _mc2cfg(url='', hf_hub='', **kwargs):
  function _pecfg (line 105) | def _pecfg(url='', hf_hub='', **kwargs):
  function _clean_tag (line 742) | def _clean_tag(tag: str):
  function list_pretrained (line 747) | def list_pretrained(as_str: bool = False):
  function list_pretrained_models_by_tag (line 754) | def list_pretrained_models_by_tag(tag: str):
  function list_pretrained_tags_by_model (line 764) | def list_pretrained_tags_by_model(model: str):
  function is_pretrained_cfg (line 772) | def is_pretrained_cfg(model: str, tag: str):
  function get_pretrained_cfg (line 778) | def get_pretrained_cfg(model: str, tag: str):
  function get_pretrained_url (line 785) | def get_pretrained_url(model: str, tag: str):
  function download_pretrained_from_url (line 790) | def download_pretrained_from_url(
  function has_hf_hub (line 836) | def has_hf_hub(necessary=False):
  function _get_safe_alternatives (line 844) | def _get_safe_alternatives(filename: str) -> Iterable[str]:
  function download_pretrained_from_hf (line 857) | def download_pretrained_from_hf(
  function download_pretrained (line 894) | def download_pretrained(

FILE: src/open_clip/push_to_hf_hub.py
  function save_config_for_hf (line 35) | def save_config_for_hf(
  function save_for_hf (line 58) | def save_for_hf(
  function push_to_hf_hub (line 85) | def push_to_hf_hub(
  function push_pretrained_to_hf_hub (line 156) | def push_pretrained_to_hf_hub(
  function generate_readme (line 209) | def generate_readme(model_card: dict, model_name: str):

FILE: src/open_clip/timm_model.py
  class TimmModel (line 23) | class TimmModel(nn.Module):
    method __init__ (line 27) | def __init__(
    method lock (line 105) | def lock(self, unlocked_groups: int = 0, freeze_bn_stats: bool = False):
    method set_grad_checkpointing (line 138) | def set_grad_checkpointing(self, enable: bool = True):
    method forward_intermediates (line 144) | def forward_intermediates(
    method set_input_size (line 195) | def set_input_size(self, image_size: Union[int, Tuple[int, int]]):
    method forward (line 212) | def forward(self, x):

FILE: src/open_clip/tokenizer.py
  function default_bpe (line 27) | def default_bpe():
  function bytes_to_unicode (line 32) | def bytes_to_unicode():
  function get_pairs (line 54) | def get_pairs(word):
  function basic_clean (line 66) | def basic_clean(text):
  function whitespace_clean (line 72) | def whitespace_clean(text):
  function _clean_canonicalize (line 78) | def _clean_canonicalize(x):
  function _clean_lower (line 83) | def _clean_lower(x):
  function _clean_whitespace (line 88) | def _clean_whitespace(x):
  function get_clean_fn (line 93) | def get_clean_fn(type: str):
  function canonicalize_text (line 104) | def canonicalize_text(
  class SimpleTokenizer (line 133) | class SimpleTokenizer(object):
    method __init__ (line 134) | def __init__(
    method bpe (line 172) | def bpe(self, token):
    method encode (line 213) | def encode(self, text):
    method decode (line 221) | def decode(self, tokens):
    method __call__ (line 226) | def __call__(self, texts: Union[str, List[str]], context_length: Optio...
  function decode (line 271) | def decode(output_ids: torch.Tensor):
  function tokenize (line 276) | def tokenize(texts: Union[str, List[str]], context_length: int = DEFAULT...
  function random_mask_tokenize (line 280) | def random_mask_tokenize(
  function simple_mask_tokenize (line 309) | def simple_mask_tokenize(
  function syntax_mask_tokenize (line 331) | def syntax_mask_tokenize(
  function get_reduction_mask_fn (line 390) | def get_reduction_mask_fn(type: str):
  class HFTokenizer (line 405) | class HFTokenizer:
    method __init__ (line 408) | def __init__(
    method save_pretrained (line 465) | def save_pretrained(self, dest):
    method __call__ (line 468) | def __call__(self, texts: Union[str, List[str]], context_length: Optio...
    method set_language (line 501) | def set_language(self, src_lang):
    method _clips_tokenize (line 507) | def _clips_tokenize(self, texts: List[str], context_length: int) -> to...
    method _pad_and_add_class_token (line 537) | def _pad_and_add_class_token(
  class SigLipTokenizer (line 557) | class SigLipTokenizer:
    method __init__ (line 572) | def __init__(
    method save_pretrained (line 601) | def save_pretrained(self, dest):
    method __call__ (line 604) | def __call__(self, texts: Union[str, List[str]], context_length: Optio...

FILE: src/open_clip/transform.py
  class PreprocessCfg (line 18) | class PreprocessCfg:
    method __post_init__ (line 27) | def __post_init__(self):
    method num_channels (line 31) | def num_channels(self):
    method input_size (line 35) | def input_size(self):
  function merge_preprocess_dict (line 41) | def merge_preprocess_dict(
  function merge_preprocess_kwargs (line 58) | def merge_preprocess_kwargs(base: PreprocessCfg, **kwargs):
  class AugmentationCfg (line 63) | class AugmentationCfg:
  function _setup_size (line 76) | def _setup_size(size, error_msg):
  class ResizeKeepRatio (line 89) | class ResizeKeepRatio:
    method __init__ (line 95) | def __init__(
    method get_params (line 117) | def get_params(
    method __call__ (line 145) | def __call__(self, img):
    method __repr__ (line 161) | def __repr__(self):
  function center_crop_or_pad (line 168) | def center_crop_or_pad(img: torch.Tensor, output_size: List[int], fill=0...
  class CenterCropOrPad (line 208) | class CenterCropOrPad(torch.nn.Module):
    method __init__ (line 220) | def __init__(self, size, fill=0):
    method forward (line 225) | def forward(self, img):
    method __repr__ (line 235) | def __repr__(self) -> str:
  class MaybeConvertMode (line 239) | class MaybeConvertMode:
    method __init__ (line 243) | def __init__(self, mode="RGB") -> None:
    method __call__ (line 247) | def __call__(self, pic):
    method __repr__ (line 261) | def __repr__(self) -> str:
  function _convert_to_rgb (line 265) | def _convert_to_rgb(image):
  class MaybeToTensor (line 269) | class MaybeToTensor(ToTensor):
    method __init__ (line 273) | def __init__(self) -> None:
    method __call__ (line 276) | def __call__(self, pic) -> torch.Tensor:
    method __repr__ (line 288) | def __repr__(self) -> str:
  class color_jitter (line 292) | class color_jitter(object):
    method __init__ (line 296) | def __init__(self, brightness=0., contrast=0., saturation=0., hue=0., ...
    method __call__ (line 301) | def __call__(self, img):
  class gray_scale (line 308) | class gray_scale(object):
    method __init__ (line 312) | def __init__(self, p=0.2):
    method __call__ (line 317) | def __call__(self, img):
  function image_transform (line 324) | def image_transform(
  function image_transform_v2 (line 443) | def image_transform_v2(

FILE: src/open_clip/transformer.py
  class LayerNormFp32 (line 14) | class LayerNormFp32(nn.LayerNorm):
    method forward (line 17) | def forward(self, x: torch.Tensor):
  class LayerNorm (line 23) | class LayerNorm(nn.LayerNorm):
    method forward (line 26) | def forward(self, x: torch.Tensor):
  class QuickGELU (line 32) | class QuickGELU(nn.Module):
    method forward (line 34) | def forward(self, x: torch.Tensor):
  class LayerScale (line 38) | class LayerScale(nn.Module):
    method __init__ (line 39) | def __init__(self, dim, init_values=1e-5, inplace=False):
    method forward (line 44) | def forward(self, x):
  class PatchDropout (line 48) | class PatchDropout(nn.Module):
    method __init__ (line 53) | def __init__(
    method forward (line 63) | def forward(self, x):
  class Attention (line 92) | class Attention(nn.Module):
    method __init__ (line 93) | def __init__(
    method forward (line 157) | def forward(self, x, attn_mask: Optional[torch.Tensor] = None):
  class AttentionalPooler (line 215) | class AttentionalPooler(nn.Module):
    method __init__ (line 216) | def __init__(
    method forward (line 230) | def forward(self, x: torch.Tensor):
  class ResidualAttentionBlock (line 238) | class ResidualAttentionBlock(nn.Module):
    method __init__ (line 239) | def __init__(
    method get_weight_dtype (line 267) | def get_weight_dtype(self) -> torch.dtype:
    method attention (line 272) | def attention(
    method forward (line 289) | def forward(
  class CustomResidualAttentionBlock (line 303) | class CustomResidualAttentionBlock(nn.Module):
    method __init__ (line 304) | def __init__(
    method get_weight_dtype (line 346) | def get_weight_dtype(self) -> torch.dtype:
    method forward (line 351) | def forward(self, x: torch.Tensor, attn_mask: Optional[torch.Tensor] =...
  class CustomTransformer (line 357) | class CustomTransformer(nn.Module):
    method __init__ (line 359) | def __init__(
    method get_cast_dtype (line 400) | def get_cast_dtype(self) -> torch.dtype:
    method forward_intermediates (line 403) | def forward_intermediates(
    method prune_intermediate_layers (line 434) | def prune_intermediate_layers(self, indices: Union[int, List[int]] = 1):
    method forward (line 441) | def forward(self, x: torch.Tensor, attn_mask: Optional[torch.Tensor] =...
  class Transformer (line 457) | class Transformer(nn.Module):
    method __init__ (line 458) | def __init__(
    method get_cast_dtype (line 522) | def get_cast_dtype(self) -> torch.dtype:
    method forward_intermediates (line 525) | def forward_intermediates(
    method prune_intermediate_layers (line 556) | def prune_intermediate_layers(self, indices: Union[int, List[int]] = 1):
    method forward (line 563) | def forward(self, x: torch.Tensor, attn_mask: Optional[torch.Tensor] =...
  function _expand_token (line 579) | def _expand_token(token, batch_size: int):
  class VisionTransformer (line 583) | class VisionTransformer(nn.Module):
    method __init__ (line 586) | def __init__(
    method lock (line 710) | def lock(self, unlocked_groups: int = 0, freeze_bn_stats: bool = False):
    method init_parameters (line 743) | def init_parameters(self):
    method set_grad_checkpointing (line 764) | def set_grad_checkpointing(self, enable: bool = True):
    method no_weight_decay (line 768) | def no_weight_decay(self):
    method _global_pool (line 773) | def _global_pool(self, x: torch.Tensor) -> Tuple[torch.Tensor, torch.T...
    method _embeds (line 783) | def _embeds(self, x:torch.Tensor) -> torch.Tensor:
    method _pool (line 800) | def _pool(self, x: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]:
    method forward_intermediates (line 825) | def forward_intermediates(
    method prune_intermediate_layers (line 892) | def prune_intermediate_layers(
    method forward (line 907) | def forward(self, x: torch.Tensor):
  function text_global_pool (line 921) | def text_global_pool(
  class TextTransformer (line 947) | class TextTransformer(nn.Module):
    method __init__ (line 950) | def __init__(
    method init_parameters (line 1034) | def init_parameters(self):
    method set_grad_checkpointing (line 1058) | def set_grad_checkpointing(self, enable=True):
    method lock (line 1061) | def lock(self, unlocked_layers: int = 0, freeze_layer_norm: bool = True):
    method no_weight_decay (line 1073) | def no_weight_decay(self):
    method build_causal_mask (line 1080) | def build_causal_mask(self):
    method _build_additive_mask (line 1088) | def _build_additive_mask(
    method _embeds (line 1112) | def _embeds(self, text) -> Tuple[torch.Tensor, Optional[torch.Tensor]]:
    method forward_intermediates (line 1137) | def forward_intermediates(
    method prune_intermediate_layers (line 1207) | def prune_intermediate_layers(
    method forward (line 1222) | def forward(self, text):
  class MultimodalTransformer (line 1250) | class MultimodalTransformer(Transformer):
    method __init__ (line 1251) | def __init__(
    method init_parameters (line 1294) | def init_parameters(self):
    method build_attention_mask (line 1312) | def build_attention_mask(self):
    method forward_intermediates (line 1320) | def forward_intermediates(
    method forward (line 1329) | def forward(self, image_embs, text_embs):
    method set_grad_checkpointing (line 1356) | def set_grad_checkpointing(self, enable=True):
  function lock_text_tower (line 1360) | def lock_text_tower(

FILE: src/open_clip/utils.py
  function freeze_batch_norm_2d (line 11) | def freeze_batch_norm_2d(module, module_match={}, name=''):
  function _ntuple (line 51) | def _ntuple(n):
  function replace_linear (line 67) | def replace_linear(model, linear_replacement, include_modules=['c_fc', '...
  function convert_int8_model_to_inference_mode (line 86) | def convert_int8_model_to_inference_mode(model):
  function feature_take_indices (line 94) | def feature_take_indices(
  function _out_indices_as_tuple (line 135) | def _out_indices_as_tuple(x: Union[int, Tuple[int, ...]]) -> Tuple[int, ...

FILE: src/open_clip/zero_shot_classifier.py
  function batched (line 9) | def batched(iterable, n):
  function build_zero_shot_classifier (line 21) | def build_zero_shot_classifier(
  function build_zero_shot_classifier_legacy (line 71) | def build_zero_shot_classifier_legacy(

FILE: src/open_clip_train/data.py
  class CsvDataset (line 29) | class CsvDataset(Dataset):
    method __init__ (line 30) | def __init__(self, input_filename, transforms, img_key, caption_key, s...
    method __len__ (line 41) | def __len__(self):
    method __getitem__ (line 44) | def __getitem__(self, idx):
  class SharedEpoch (line 50) | class SharedEpoch:
    method __init__ (line 51) | def __init__(self, epoch: int = 0):
    method set_value (line 54) | def set_value(self, epoch):
    method get_value (line 57) | def get_value(self):
  class DataInfo (line 62) | class DataInfo:
    method set_epoch (line 67) | def set_epoch(self, epoch):
  function expand_urls (line 74) | def expand_urls(urls, weights=None):
  function get_dataset_size (line 96) | def get_dataset_size(shards):
  function get_imagenet (line 118) | def get_imagenet(args, preprocess_fns, split):
  function count_samples (line 164) | def count_samples(dataloader):
  function filter_no_caption_or_no_image (line 174) | def filter_no_caption_or_no_image(sample):
  function log_and_continue (line 180) | def log_and_continue(exn):
  function group_by_keys_nothrow (line 186) | def group_by_keys_nothrow(data, keys=base_plus_ext, lcase=True, suffixes...
  function tarfile_to_samples_nothrow (line 214) | def tarfile_to_samples_nothrow(src, handler=log_and_continue):
  function pytorch_worker_seed (line 222) | def pytorch_worker_seed(increment=0):
  class detshuffle2 (line 242) | class detshuffle2(wds.PipelineStage):
    method __init__ (line 243) | def __init__(
    method run (line 255) | def run(self, src):
  class ResampledShards2 (line 274) | class ResampledShards2(IterableDataset):
    method __init__ (line 277) | def __init__(
    method __iter__ (line 304) | def __iter__(self):
  function get_wds_dataset (line 328) | def get_wds_dataset(args, preprocess_img, is_train, epoch=0, floor=False...
  function get_csv_dataset (line 446) | def get_csv_dataset(args, preprocess_fn, is_train, epoch=0, tokenizer=No...
  class SyntheticDataset (line 476) | class SyntheticDataset(Dataset):
    method __init__ (line 478) | def __init__(
    method __len__ (line 494) | def __len__(self):
    method __getitem__ (line 497) | def __getitem__(self, idx):
  function get_synthetic_dataset (line 503) | def get_synthetic_dataset(args, preprocess_fn, is_train, epoch=0, tokeni...
  function get_dataset_fn (line 526) | def get_dataset_fn(data_path, dataset_type):
  function get_data (line 546) | def get_data(args, preprocess_fns, epoch=0, tokenizer=None):

FILE: src/open_clip_train/distributed.py
  function is_global_master (line 14) | def is_global_master(args):
  function is_local_master (line 18) | def is_local_master(args):
  function is_master (line 22) | def is_master(args, local=False):
  function is_device_available (line 26) | def is_device_available(device):
  function set_device (line 47) | def set_device(device):
  function is_using_horovod (line 54) | def is_using_horovod():
  function is_using_distributed (line 65) | def is_using_distributed():
  function world_info_from_env (line 73) | def world_info_from_env():
  function init_distributed_device (line 93) | def init_distributed_device(args):
  function init_distributed_device_so (line 116) | def init_distributed_device_so(
  function broadcast_object (line 198) | def broadcast_object(args, obj, src=0):
  function all_gather_object (line 211) | def all_gather_object(args, obj, dst=0):

FILE: src/open_clip_train/file_utils.py
  function remote_sync_s3 (line 10) | def remote_sync_s3(local_dir, remote_dir):
  function remote_sync_fsspec (line 20) | def remote_sync_fsspec(local_dir, remote_dir):
  function remote_sync (line 44) | def remote_sync(local_dir, remote_dir, protocol):
  function keep_running_remote_sync (line 54) | def keep_running_remote_sync(sync_every, local_dir, remote_dir, protocol):
  function start_sync_process (line 59) | def start_sync_process(sync_every, local_dir, remote_dir, protocol):
  function pt_save (line 64) | def pt_save(pt_obj, file_path):
  function pt_load (line 69) | def pt_load(file_path, map_location=None):
  function check_exists (line 77) | def check_exists(file_path):

FILE: src/open_clip_train/logger.py
  function setup_logging (line 4) | def setup_logging(log_file, level, include_host=False):

FILE: src/open_clip_train/main.py
  function random_seed (line 44) | def random_seed(seed=42, rank=0):
  function natural_key (line 50) | def natural_key(string_):
  function get_latest_checkpoint (line 55) | def get_latest_checkpoint(path: str, remote : bool):
  function main (line 71) | def main(args):
  function copy_codebase (line 564) | def copy_codebase(args):

FILE: src/open_clip_train/params.py
  function get_default_params (line 5) | def get_default_params(model_name):
  class ParseKwargs (line 14) | class ParseKwargs(argparse.Action):
    method __call__ (line 15) | def __call__(self, parser, namespace, values, option_string=None):
  function parse_args (line 26) | def parse_args(args):

FILE: src/open_clip_train/precision.py
  function get_autocast (line 6) | def get_autocast(precision, device_type='cuda'):

FILE: src/open_clip_train/profiler.py
  function profile_fvcore (line 26) | def profile_fvcore(
  function profile_fvcore_text (line 47) | def profile_fvcore_text(
  function profile_fvcore_image (line 66) | def profile_fvcore_image(
  function profile_torch_image (line 85) | def profile_torch_image(model, image_input_size, batch_size=1, force_cpu...
  function profile_torch_text (line 99) | def profile_torch_text(model, text_input_size, batch_size=1, force_cpu=F...
  function profile_torch (line 113) | def profile_torch(model, text_input_size, image_input_size, batch_size=1...
  function count_params (line 128) | def count_params(model):
  function profile_model (line 131) | def profile_model(model_name, batch_size=1, profiler='torch', device="cu...
  function main (line 211) | def main():

FILE: src/open_clip_train/scheduler.py
  function assign_learning_rate (line 4) | def assign_learning_rate(optimizer, new_lr):
  function _warmup_lr (line 9) | def _warmup_lr(base_lr, warmup_length, step):
  function const_lr (line 13) | def const_lr(optimizer, base_lr, warmup_length, steps):
  function const_lr_cooldown (line 25) | def const_lr_cooldown(optimizer, base_lr, warmup_length, steps, cooldown...
  function cosine_lr (line 45) | def cosine_lr(optimizer, base_lr, warmup_length, steps):

FILE: src/open_clip_train/train.py
  class AverageMeter (line 23) | class AverageMeter(object):
    method __init__ (line 26) | def __init__(self):
    method reset (line 29) | def reset(self):
    method update (line 35) | def update(self, val, n=1):
  function postprocess_clip_output (line 42) | def postprocess_clip_output(model_out):
  function unwrap_model (line 50) | def unwrap_model(model):
  function backward (line 57) | def backward(total_loss, scaler):
  function train_one_epoch (line 64) | def train_one_epoch(model, data, loss, epoch, optimizer, scaler, schedul...
  function evaluate (line 251) | def evaluate(model, data, epoch, args, tb_writer=None, tokenizer=None):
  function get_clip_metrics (line 363) | def get_clip_metrics(image_features, text_features, logit_scale):
  function maybe_compute_generative_loss (line 383) | def maybe_compute_generative_loss(model_out):

FILE: src/open_clip_train/zero_shot.py
  function accuracy (line 11) | def accuracy(output, target, topk=(1,)):
  function run (line 17) | def run(model, classifier, dataloader, args):
  function zero_shot_eval (line 45) | def zero_shot_eval(model, data, epoch, args, tokenizer=None):

FILE: tests/test_download_pretrained.py
  class DownloadPretrainedTests (line 18) | class DownloadPretrainedTests(unittest.TestCase):
    method create_response (line 20) | def create_response(self, data, status_code=200, content_type='applica...
    method test_download_pretrained_from_url_from_openaipublic (line 30) | def test_download_pretrained_from_url_from_openaipublic(self, urllib):
    method test_download_pretrained_from_url_from_openaipublic_corrupted (line 40) | def test_download_pretrained_from_url_from_openaipublic_corrupted(self...
    method test_download_pretrained_from_url_from_openaipublic_valid_cache (line 51) | def test_download_pretrained_from_url_from_openaipublic_valid_cache(se...
    method test_download_pretrained_from_url_from_openaipublic_corrupted_cache (line 63) | def test_download_pretrained_from_url_from_openaipublic_corrupted_cach...
    method test_download_pretrained_from_url_from_mlfoundations (line 75) | def test_download_pretrained_from_url_from_mlfoundations(self, urllib):
    method test_download_pretrained_from_url_from_mlfoundations_corrupted (line 85) | def test_download_pretrained_from_url_from_mlfoundations_corrupted(sel...
    method test_download_pretrained_from_hfh (line 96) | def test_download_pretrained_from_hfh(self, urllib):

FILE: tests/test_hf_model.py
  function test_poolers (line 9) | def test_poolers():
  function test_pretrained_text_encoder (line 22) | def test_pretrained_text_encoder(model_id):

FILE: tests/test_inference.py
  function test_inference_with_data (line 57) | def test_inference_with_data(

FILE: tests/test_inference_simple.py
  function test_inference_simple (line 26) | def test_inference_simple(

FILE: tests/test_num_shards.py
  function test_num_shards (line 18) | def test_num_shards(shards, expected_size):

FILE: tests/test_training_simple.py
  function test_training (line 17) | def test_training():
  function test_training_coca (line 33) | def test_training_coca():
  function test_training_mt5 (line 49) | def test_training_mt5():
  function test_training_unfreezing_vit (line 69) | def test_training_unfreezing_vit():
  function test_training_clip_with_jit (line 89) | def test_training_clip_with_jit():

FILE: tests/test_wds.py
  function build_inputs (line 19) | def build_inputs(test_name):
  function build_params (line 56) | def build_params(input_shards, seed=0):
  function get_dataloader (line 73) | def get_dataloader(input_shards):
  function test_single_source (line 80) | def test_single_source():
  function test_two_sources (line 96) | def test_two_sources():
  function test_two_sources_same_weights (line 112) | def test_two_sources_same_weights():
  function test_two_sources_with_upsampling (line 130) | def test_two_sources_with_upsampling():

FILE: tests/util_test.py
  function seed_all (line 16) | def seed_all(seed = 0):
  function inference_text (line 24) | def inference_text(model, model_name, batches):
  function inference_image (line 33) | def inference_image(model, preprocess_val, batches):
  function forward_model (line 41) | def forward_model(model, model_name, preprocess_val, image_batch, text_b...
  function random_image_batch (line 59) | def random_image_batch(batch_size, size):
  function random_text_batch (line 64) | def random_text_batch(batch_size, min_length = 75, max_length = 75):
  function create_random_text_data (line 81) | def create_random_text_data(
  function create_random_image_data (line 95) | def create_random_image_data(path, size, batches = 1, batch_size = 1):
  function get_data_dirs (line 103) | def get_data_dirs(make_dir = True):
  function create_test_data_for_model (line 114) | def create_test_data_for_model(
  function create_test_data (line 176) | def create_test_data(
  function _sytem_assert (line 200) | def _sytem_assert(string):
  class TestWrapper (line 203) | class TestWrapper(torch.nn.Module):
    method __init__ (line 205) | def __init__(self, model, model_name, output_dict=True) -> None:
    method forward (line 214) | def forward(self, image, text):
  function main (line 221) | def main(args):
Condensed preview — 229 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,236K chars).
[
  {
    "path": ".gitattributes",
    "chars": 61,
    "preview": "*.py linguist-language=python\n*.ipynb linguist-documentation\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 3596,
    "preview": "name: Continuous integration\n\non:\n  push:\n    branches:\n    - main \n    paths-ignore:\n    - '**.md'\n    - 'CITATION.cff'"
  },
  {
    "path": ".github/workflows/clear-cache.yml",
    "chars": 716,
    "preview": "name: Clear cache\n\non:\n  workflow_dispatch:\n\npermissions:\n  actions: write\n\njobs:\n  clear-cache:\n    runs-on: ubuntu-lat"
  },
  {
    "path": ".github/workflows/python-publish.yml",
    "chars": 993,
    "preview": "name: Release\n\non:\n  push:\n    branches:\n    - main\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: ac"
  },
  {
    "path": ".gitignore",
    "chars": 2010,
    "preview": "**/logs/\n**/wandb/\nmodels/\nfeatures/\nresults/\n\ntests/data/\n*.pt\n\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*."
  },
  {
    "path": "CITATION.cff",
    "chars": 824,
    "preview": "cff-version: 1.1.0\nmessage: If you use this software, please cite it as below.\nauthors:\n  - family-names: Ilharco\n    gi"
  },
  {
    "path": "HISTORY.md",
    "chars": 5142,
    "preview": "## 2.24.0\n\n* Fix missing space in error message\n* use model flag for normalizing embeddings\n* init logit_bias for non si"
  },
  {
    "path": "LICENSE",
    "chars": 1229,
    "preview": "Copyright (c) 2012-2021 Gabriel Ilharco, Mitchell Wortsman, \nNicholas Carlini, Rohan Taori, Achal Dave, Vaishaal Shankar"
  },
  {
    "path": "MANIFEST.in",
    "chars": 95,
    "preview": "include src/open_clip/bpe_simple_vocab_16e6.txt.gz\ninclude src/open_clip/model_configs/*.json\n\n"
  },
  {
    "path": "Makefile",
    "chars": 403,
    "preview": "install: ## [Local development] Upgrade pip, install requirements, install package.\n\tpython -m pip install -U pip\n\tpytho"
  },
  {
    "path": "README.md",
    "chars": 30481,
    "preview": "# OpenCLIP\n\n[[Paper]](https://arxiv.org/abs/2212.07143) [[Citations]](#citing) [[Clip Colab]](https://colab.research.goo"
  },
  {
    "path": "docs/Interacting_with_open_clip.ipynb",
    "chars": 6677789,
    "preview": "{\n  \"cells\": [\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"view-in-github\",\n        \"colab_t"
  },
  {
    "path": "docs/Interacting_with_open_coca.ipynb",
    "chars": 62191,
    "preview": "{\n  \"nbformat\": 4,\n  \"nbformat_minor\": 0,\n  \"metadata\": {\n    \"colab\": {\n      \"provenance\": []\n    },\n    \"kernelspec\":"
  },
  {
    "path": "docs/LOW_ACC.md",
    "chars": 2841,
    "preview": "As we describe in more detail below, CLIP models in a medium accuracy regime already allow us to draw conclusions about "
  },
  {
    "path": "docs/PRETRAINED.md",
    "chars": 16055,
    "preview": "## Pretrained model results\n\nWe evaluate the full collection of available models on a suite of 38 datasets in a zero-sho"
  },
  {
    "path": "docs/clip_conceptual_captions.md",
    "chars": 262,
    "preview": "## Additional training curves for CLIP on Conceptual Captions\n\n# Zero shot accuracy\n![](/docs/clip_zeroshot.png)\n\n# Trai"
  },
  {
    "path": "docs/clipa.md",
    "chars": 7112,
    "preview": "## CLIPA\n\nIn this work, we present a surprising finding that there exists an _inverse_ scaling law for CLIP training, \nw"
  },
  {
    "path": "docs/datacomp_models.md",
    "chars": 7372,
    "preview": "## CommonPool and DataComp models\n\nAs part of [DataComp](https://github.com/mlfoundations/datacomp), we trained models o"
  },
  {
    "path": "docs/model_profile.csv",
    "chars": 6167,
    "preview": "model,image_size,image_width,text_width,embed_dim,mparams,image_mparams,text_mparams,gflops,image_gflops,text_gflops\nViT"
  },
  {
    "path": "docs/openclip_classification_results.csv",
    "chars": 36265,
    "preview": "name,pretrained,params (M),FLOPs (B),Average perf. on 35 datasets,ImageNet 1k,Caltech-101,CIFAR-10,CIFAR-100,CLEVR Count"
  },
  {
    "path": "docs/openclip_multilingual_retrieval_results.csv",
    "chars": 259661,
    "preview": "model,version,avg,crossmodal3600 image_retrieval_recall@1 avg,crossmodal3600 image_retrieval_recall@1 ar,crossmodal3600 "
  },
  {
    "path": "docs/openclip_results.csv",
    "chars": 38830,
    "preview": "name,pretrained,params (M),FLOPs (B),Average perf. on 38 datasets,ImageNet 1k,Caltech-101,CIFAR-10,CIFAR-100,CLEVR Count"
  },
  {
    "path": "docs/openclip_retrieval_results.csv",
    "chars": 22758,
    "preview": "name,pretrained,params (M),FLOPs (B),Average score,Flickr image retr. R@1,Flickr image retr. R@5,Flickr image retr. R@10"
  },
  {
    "path": "docs/script_examples/clipa/vit_b16/i50_t16_finetune.sh",
    "chars": 726,
    "preview": "torchrun --nproc_per_node 8 -m open_clip_train.main \\\n    --save-frequency 1 \\\n    --save-most-recent \\\n    --zeroshot-f"
  },
  {
    "path": "docs/script_examples/clipa/vit_b16/i50_t16_pretrain.sh",
    "chars": 682,
    "preview": "torchrun --nproc_per_node 8 -m open_clip_train.main \\\n    --save-frequency 1 \\\n    --save-most-recent \\\n    --zeroshot-f"
  },
  {
    "path": "docs/script_examples/clipa/vit_l16/i17_t16_finetune.sh",
    "chars": 810,
    "preview": "torchrun --nproc_per_node 8 -m open_clip_train.main \\\n    --save-frequency 1 \\\n    --save-most-recent \\\n    --zeroshot-f"
  },
  {
    "path": "docs/script_examples/clipa/vit_l16/i17_t16_pretrain.sh",
    "chars": 768,
    "preview": "torchrun --nproc_per_node 8 -m open_clip_train.main \\\n    --save-frequency 1 \\\n    --save-most-recent \\\n    --zeroshot-f"
  },
  {
    "path": "docs/script_examples/clipa/vit_l16/i37_t8_finetune.sh",
    "chars": 810,
    "preview": "torchrun --nproc_per_node 8 -m open_clip_train.main \\\n    --save-frequency 1 \\\n    --save-most-recent \\\n    --zeroshot-f"
  },
  {
    "path": "docs/script_examples/clipa/vit_l16/i37_t8_pretrain.sh",
    "chars": 774,
    "preview": "torchrun --nproc_per_node 8 -m open_clip_train.main \\\n    --save-frequency 1 \\\n    --save-most-recent \\\n    --zeroshot-f"
  },
  {
    "path": "docs/script_examples/clipav2/vit_h14/i257_t32_finetunex4.sh",
    "chars": 1137,
    "preview": "# have not been tested. use it at your own discretion\n# the original experiment was run on tpu v3-256.\n# this example sc"
  },
  {
    "path": "docs/script_examples/clipav2/vit_h14/i50_t8_pretrain.sh",
    "chars": 1061,
    "preview": "# have not been tested. use it at your own discretion\n# the original experiment was run on tpu v3-256.\n# this example sc"
  },
  {
    "path": "docs/script_examples/clipav2/vit_h14/i577_t32_finetunex1.sh",
    "chars": 1138,
    "preview": "# have not been tested. use it at your own discretion\n# the original experiment was run on tpu v3-256.\n# this example sc"
  },
  {
    "path": "docs/script_examples/stability_example.sh",
    "chars": 1663,
    "preview": "#!/bin/bash\n#SBATCH --partition=g40423\n#SBATCH --job-name=testopenclip\n#SBATCH --nodes 30\n#SBATCH --ntasks-per-node=8\n#S"
  },
  {
    "path": "pyproject.toml",
    "chars": 2226,
    "preview": "[build-system]\nrequires = [\"pdm-backend\"]\nbuild-backend = \"pdm.backend\"\n\n[project]\nname = \"open_clip_torch\"\n# NOTE for f"
  },
  {
    "path": "pytest.ini",
    "chars": 39,
    "preview": "[pytest]\nmarkers =\n    regression_test\n"
  },
  {
    "path": "requirements-test.txt",
    "chars": 92,
    "preview": "pytest-split==0.8.0\npytest==7.2.0\ntransformers[sentencepiece]\ntimm>=1.0.17\nrequests>=2.32.5\n"
  },
  {
    "path": "requirements-training.txt",
    "chars": 161,
    "preview": "torch>=2.0\ntorchvision\nwebdataset>=0.2.5,<=0.2.86\nregex\nftfy\ntqdm\npandas\nbraceexpand\nhuggingface_hub\nsafetensors\ntransfo"
  },
  {
    "path": "requirements.txt",
    "chars": 72,
    "preview": "torch>=2.0\ntorchvision\nregex\nftfy\ntqdm\nhuggingface_hub\nsafetensors\ntimm\n"
  },
  {
    "path": "scripts/clipav1_vit_l16_i37_t8.sh",
    "chars": 276,
    "preview": "# eval on a single gpu\nCUDA_VISIBLE_DEVICES=2 TORCH_CUDNN_V8_API_ENABLED=1 TFDS_PREFETCH_SIZE=8192 python3 -m open_clip_"
  },
  {
    "path": "scripts/clipav2_vit_h14_i84_224_336_cl32_gap_datacomp1b.sh",
    "chars": 392,
    "preview": "CUDA_VISIBLE_DEVICES=1 python3 -m open_clip_train.main \\\n    --model ViT-H-14-CL32-GAP-BigVision \\\n    --pretrained \"/pa"
  },
  {
    "path": "scripts/h14_224_32_finetune.sh",
    "chars": 890,
    "preview": "# 64k batchsize for 2.048e-3 lr\nTORCH_CUDNN_V8_API_ENABLED=1 torchrun --nproc_per_node 8 -m open_clip_train.main \\\n    -"
  },
  {
    "path": "scripts/h14_84_8_pretrain.sh",
    "chars": 899,
    "preview": "# 64k batchsize for 2.048e-3 lr\nTORCH_CUDNN_V8_API_ENABLED=1 torchrun --nproc_per_node 8 -m open_clip_train.main \\\n    -"
  },
  {
    "path": "src/open_clip/__init__.py",
    "chars": 1298,
    "preview": "from .version import __version__\n\nfrom .coca_model import CoCa\nfrom .constants import OPENAI_DATASET_MEAN, OPENAI_DATASE"
  },
  {
    "path": "src/open_clip/coca_model.py",
    "chars": 23181,
    "preview": "from typing import Dict, List, Optional, Union\n\nimport torch\nfrom torch import nn\nfrom torch.nn import functional as F\ni"
  },
  {
    "path": "src/open_clip/constants.py",
    "chars": 510,
    "preview": "OPENAI_DATASET_MEAN = (0.48145466, 0.4578275, 0.40821073)\nOPENAI_DATASET_STD = (0.26862954, 0.26130258, 0.27577711)\nIMAG"
  },
  {
    "path": "src/open_clip/convert.py",
    "chars": 11091,
    "preview": "\"\"\" Conversion functions for 3rd part state-dicts and non-torch native checkpoint formats.\n\"\"\"\nfrom typing import Union\n"
  },
  {
    "path": "src/open_clip/factory.py",
    "chars": 51736,
    "preview": "import json\nimport logging\nimport os\nimport re\nimport warnings\nfrom copy import deepcopy\nfrom dataclasses import asdict\n"
  },
  {
    "path": "src/open_clip/hf_configs.py",
    "chars": 2422,
    "preview": "# HF architecture dict:\narch_dict = {\n    # https://huggingface.co/docs/transformers/model_doc/roberta#roberta\n    \"robe"
  },
  {
    "path": "src/open_clip/hf_model.py",
    "chars": 6960,
    "preview": "\"\"\" huggingface model adapter\n\nWraps HuggingFace transformers (https://github.com/huggingface/transformers) models for u"
  },
  {
    "path": "src/open_clip/loss.py",
    "chars": 17272,
    "preview": "from typing import Optional\n\nimport torch\nimport torch.nn as nn\nfrom torch.nn import functional as F\n\ntry:\n    import to"
  },
  {
    "path": "src/open_clip/model.py",
    "chars": 37482,
    "preview": "\"\"\" CLIP Model\n\nAdapted from https://github.com/openai/CLIP. Originally MIT License, Copyright (c) 2021 OpenAI.\n\"\"\"\nimpo"
  },
  {
    "path": "src/open_clip/model_configs/EVA01-g-14-plus.json",
    "chars": 401,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"timm_model_name\": \"eva_giant_patch14_22"
  },
  {
    "path": "src/open_clip/model_configs/EVA01-g-14.json",
    "chars": 400,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"timm_model_name\": \"eva_giant_patch14_22"
  },
  {
    "path": "src/open_clip/model_configs/EVA02-B-16.json",
    "chars": 404,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"timm_model_name\": \"eva02_base_patch16_cl"
  },
  {
    "path": "src/open_clip/model_configs/EVA02-E-14-plus.json",
    "chars": 411,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"timm_model_name\": \"eva02_enormous_patch"
  },
  {
    "path": "src/open_clip/model_configs/EVA02-E-14.json",
    "chars": 411,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"timm_model_name\": \"eva02_enormous_patch"
  },
  {
    "path": "src/open_clip/model_configs/EVA02-L-14-336.json",
    "chars": 406,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"image_size\": 336,\n        \"timm_model_name\": \"eva02_large_patch14_c"
  },
  {
    "path": "src/open_clip/model_configs/EVA02-L-14.json",
    "chars": 406,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"timm_model_name\": \"eva02_large_patch14_c"
  },
  {
    "path": "src/open_clip/model_configs/MobileCLIP-B.json",
    "chars": 483,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"vit_base_mci_224\",\n        \"timm_model_pretraine"
  },
  {
    "path": "src/open_clip/model_configs/MobileCLIP-S1.json",
    "chars": 476,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"fastvit_mci1\",\n        \"timm_model_pretrained\": "
  },
  {
    "path": "src/open_clip/model_configs/MobileCLIP-S2.json",
    "chars": 476,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"fastvit_mci2\",\n        \"timm_model_pretrained\": "
  },
  {
    "path": "src/open_clip/model_configs/MobileCLIP2-B.json",
    "chars": 483,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"vit_base_mci_224\",\n        \"timm_model_pretraine"
  },
  {
    "path": "src/open_clip/model_configs/MobileCLIP2-L-14.json",
    "chars": 493,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"vit_large_patch14_clip_224\",\n        \"timm_model"
  },
  {
    "path": "src/open_clip/model_configs/MobileCLIP2-S0.json",
    "chars": 476,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"fastvit_mci0\",\n        \"timm_model_pretrained\": "
  },
  {
    "path": "src/open_clip/model_configs/MobileCLIP2-S2.json",
    "chars": 476,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"fastvit_mci2\",\n        \"timm_model_pretrained\": "
  },
  {
    "path": "src/open_clip/model_configs/MobileCLIP2-S3.json",
    "chars": 477,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"fastvit_mci3\",\n        \"timm_model_pretrained\": "
  },
  {
    "path": "src/open_clip/model_configs/MobileCLIP2-S4.json",
    "chars": 477,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"fastvit_mci4\",\n        \"timm_model_pretrained\": "
  },
  {
    "path": "src/open_clip/model_configs/PE-Core-B-16.json",
    "chars": 406,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"timm_model_name\": \"vit_pe_core_base_pat"
  },
  {
    "path": "src/open_clip/model_configs/PE-Core-L-14-336.json",
    "chars": 407,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 336,\n        \"timm_model_name\": \"vit_pe_core_large_pa"
  },
  {
    "path": "src/open_clip/model_configs/PE-Core-S-16-384.json",
    "chars": 404,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 384,\n        \"timm_model_name\": \"vit_pe_core_small_pat"
  },
  {
    "path": "src/open_clip/model_configs/PE-Core-T-16-384.json",
    "chars": 403,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 384,\n        \"timm_model_name\": \"vit_pe_core_tiny_patc"
  },
  {
    "path": "src/open_clip/model_configs/PE-Core-bigG-14-448.json",
    "chars": 410,
    "preview": "{\n    \"embed_dim\": 1280,\n    \"vision_cfg\": {\n        \"image_size\": 448,\n        \"timm_model_name\": \"vit_pe_core_gigantic"
  },
  {
    "path": "src/open_clip/model_configs/RN101-quickgelu.json",
    "chars": 388,
    "preview": "{\n    \"embed_dim\": 512,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": [\n     "
  },
  {
    "path": "src/open_clip/model_configs/RN101.json",
    "chars": 364,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": [\n            3,\n            4,"
  },
  {
    "path": "src/open_clip/model_configs/RN50-quickgelu.json",
    "chars": 389,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": [\n    "
  },
  {
    "path": "src/open_clip/model_configs/RN50.json",
    "chars": 364,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": [\n            3,\n            4"
  },
  {
    "path": "src/open_clip/model_configs/RN50x16-quickgelu.json",
    "chars": 389,
    "preview": "{\n    \"embed_dim\": 768,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 384,\n        \"layers\": [\n     "
  },
  {
    "path": "src/open_clip/model_configs/RN50x16.json",
    "chars": 365,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"image_size\": 384,\n        \"layers\": [\n            6,\n            8,"
  },
  {
    "path": "src/open_clip/model_configs/RN50x4-quickgelu.json",
    "chars": 389,
    "preview": "{\n    \"embed_dim\": 640,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 288,\n        \"layers\": [\n     "
  },
  {
    "path": "src/open_clip/model_configs/RN50x4.json",
    "chars": 365,
    "preview": "{\n    \"embed_dim\": 640,\n    \"vision_cfg\": {\n        \"image_size\": 288,\n        \"layers\": [\n            4,\n            6,"
  },
  {
    "path": "src/open_clip/model_configs/RN50x64-quickgelu.json",
    "chars": 394,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 448,\n        \"layers\": [\n    "
  },
  {
    "path": "src/open_clip/model_configs/RN50x64.json",
    "chars": 370,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 448,\n        \"layers\": [\n            3,\n            1"
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-16-SigLIP-256.json",
    "chars": 710,
    "preview": "{\n    \"embed_dim\": 768,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": 2"
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-16-SigLIP-384.json",
    "chars": 710,
    "preview": "{\n    \"embed_dim\": 768,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": 3"
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-16-SigLIP-512.json",
    "chars": 710,
    "preview": "{\n    \"embed_dim\": 768,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": 5"
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-16-SigLIP-i18n-256.json",
    "chars": 720,
    "preview": "{\n    \"embed_dim\": 768,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": 2"
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-16-SigLIP.json",
    "chars": 710,
    "preview": "{\n    \"embed_dim\": 768,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": 2"
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-16-SigLIP2-256.json",
    "chars": 785,
    "preview": "{\n    \"embed_dim\": 768,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": 2"
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-16-SigLIP2-384.json",
    "chars": 785,
    "preview": "{\n    \"embed_dim\": 768,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": 3"
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-16-SigLIP2-512.json",
    "chars": 785,
    "preview": "{\n    \"embed_dim\": 768,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": 5"
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-16-SigLIP2.json",
    "chars": 781,
    "preview": "{\n    \"embed_dim\": 768,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": 2"
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-16-plus-240.json",
    "chars": 295,
    "preview": "{\n    \"embed_dim\": 640,\n    \"vision_cfg\": {\n        \"image_size\": 240,\n        \"layers\": 12,\n        \"width\": 896,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-16-plus.json",
    "chars": 295,
    "preview": "{\n    \"embed_dim\": 640,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 896,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-16-quickgelu.json",
    "chars": 318,
    "preview": "{\n    \"embed_dim\": 512,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-16.json",
    "chars": 294,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 768,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-32-256.json",
    "chars": 295,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 256,\n        \"layers\": 12,\n        \"width\": 768,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-32-SigLIP2-256.json",
    "chars": 786,
    "preview": "{\n    \"embed_dim\": 768,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": 2"
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-32-plus-256.json",
    "chars": 295,
    "preview": "{\n    \"embed_dim\": 640,\n    \"vision_cfg\": {\n        \"image_size\": 256,\n        \"layers\": 12,\n        \"width\": 896,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-32-quickgelu.json",
    "chars": 318,
    "preview": "{\n    \"embed_dim\": 512,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-B-32.json",
    "chars": 294,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 768,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-H-14-378-quickgelu.json",
    "chars": 348,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 378,\n        \"layers\": 32,\n  "
  },
  {
    "path": "src/open_clip/model_configs/ViT-H-14-378.json",
    "chars": 324,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 378,\n        \"layers\": 32,\n        \"width\": 1280,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-H-14-CLIPA-336.json",
    "chars": 604,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 336,\n        \"layers\": 32,\n        \"width\": 1280,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-H-14-CLIPA.json",
    "chars": 604,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 32,\n        \"width\": 1280,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-H-14-quickgelu.json",
    "chars": 348,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 32,\n  "
  },
  {
    "path": "src/open_clip/model_configs/ViT-H-14-worldwide-378.json",
    "chars": 426,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 378,\n        \"layers\": 32,\n        \"width\": 1280,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-H-14-worldwide-quickgelu.json",
    "chars": 450,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 32,\n  "
  },
  {
    "path": "src/open_clip/model_configs/ViT-H-14-worldwide.json",
    "chars": 426,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 32,\n        \"width\": 1280,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-H-14.json",
    "chars": 324,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 32,\n        \"width\": 1280,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-H-16.json",
    "chars": 324,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 32,\n        \"width\": 1280,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-14-280.json",
    "chars": 296,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"image_size\": 280,\n        \"layers\": 24,\n        \"width\": 1024,\n    "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-14-336-quickgelu.json",
    "chars": 320,
    "preview": "{\n    \"embed_dim\": 768,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 336,\n        \"layers\": 24,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-14-336.json",
    "chars": 296,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"image_size\": 336,\n        \"layers\": 24,\n        \"width\": 1024,\n    "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-14-CLIPA-336.json",
    "chars": 576,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"image_size\": 336,\n        \"layers\": 24,\n        \"width\": 1024,\n    "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-14-CLIPA.json",
    "chars": 576,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 24,\n        \"width\": 1024,\n    "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-14-quickgelu.json",
    "chars": 320,
    "preview": "{\n    \"embed_dim\": 768,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 24,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-14-worldwide-quickgelu.json",
    "chars": 495,
    "preview": "{\n    \"embed_dim\": 768,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 24,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-14-worldwide.json",
    "chars": 471,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 24,\n        \"width\": 1024,\n    "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-14.json",
    "chars": 296,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 24,\n        \"width\": 1024,\n    "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-16-320.json",
    "chars": 296,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"image_size\": 320,\n        \"layers\": 24,\n        \"width\": 1024,\n    "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-16-SigLIP-256.json",
    "chars": 713,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-16-SigLIP-384.json",
    "chars": 713,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-16-SigLIP2-256.json",
    "chars": 788,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-16-SigLIP2-384.json",
    "chars": 788,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-16-SigLIP2-512.json",
    "chars": 788,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-L-16.json",
    "chars": 296,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 24,\n        \"width\": 1024,\n    "
  },
  {
    "path": "src/open_clip/model_configs/ViT-M-16-alt.json",
    "chars": 325,
    "preview": "{\n    \"embed_dim\": 384,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 512,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-M-16.json",
    "chars": 294,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 512,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-M-32-alt.json",
    "chars": 294,
    "preview": "{\n    \"embed_dim\": 384,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 512,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-M-32.json",
    "chars": 294,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 512,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-S-16-alt.json",
    "chars": 294,
    "preview": "{\n    \"embed_dim\": 256,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 384,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-S-16.json",
    "chars": 294,
    "preview": "{\n    \"embed_dim\": 384,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 384,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-S-32-alt.json",
    "chars": 294,
    "preview": "{\n    \"embed_dim\": 256,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 384,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-S-32.json",
    "chars": 294,
    "preview": "{\n    \"embed_dim\": 384,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 384,\n     "
  },
  {
    "path": "src/open_clip/model_configs/ViT-SO400M-14-SigLIP-378.json",
    "chars": 743,
    "preview": "{\n    \"embed_dim\": 1152,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-SO400M-14-SigLIP-384.json",
    "chars": 743,
    "preview": "{\n    \"embed_dim\": 1152,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-SO400M-14-SigLIP.json",
    "chars": 743,
    "preview": "{\n    \"embed_dim\": 1152,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-SO400M-14-SigLIP2-378.json",
    "chars": 823,
    "preview": "{\n    \"embed_dim\": 1152,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-SO400M-14-SigLIP2.json",
    "chars": 819,
    "preview": "{\n    \"embed_dim\": 1152,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-SO400M-16-SigLIP-i18n-256.json",
    "chars": 755,
    "preview": "{\n    \"embed_dim\": 1152,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-SO400M-16-SigLIP2-256.json",
    "chars": 823,
    "preview": "{\n    \"embed_dim\": 1152,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-SO400M-16-SigLIP2-384.json",
    "chars": 823,
    "preview": "{\n    \"embed_dim\": 1152,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-SO400M-16-SigLIP2-512.json",
    "chars": 823,
    "preview": "{\n    \"embed_dim\": 1152,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-bigG-14-CLIPA-336.json",
    "chars": 634,
    "preview": "{\n    \"embed_dim\": 1280,\n    \"vision_cfg\": {\n        \"image_size\": 336,\n        \"layers\": 48,\n        \"width\": 1664,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-bigG-14-CLIPA.json",
    "chars": 634,
    "preview": "{\n    \"embed_dim\": 1280,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 48,\n        \"width\": 1664,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-bigG-14-quickgelu.json",
    "chars": 378,
    "preview": "{\n    \"embed_dim\": 1280,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 48,\n  "
  },
  {
    "path": "src/open_clip/model_configs/ViT-bigG-14-worldwide-378.json",
    "chars": 456,
    "preview": "{\n    \"embed_dim\": 1280,\n    \"vision_cfg\": {\n        \"image_size\": 378,\n        \"layers\": 48,\n        \"width\": 1664,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-bigG-14-worldwide.json",
    "chars": 456,
    "preview": "{\n    \"embed_dim\": 1280,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 48,\n        \"width\": 1664,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-bigG-14.json",
    "chars": 354,
    "preview": "{\n    \"embed_dim\": 1280,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 48,\n        \"width\": 1664,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-e-14.json",
    "chars": 354,
    "preview": "{\n    \"embed_dim\": 1280,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 56,\n        \"width\": 1792,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-g-14.json",
    "chars": 353,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 40,\n        \"width\": 1408,\n   "
  },
  {
    "path": "src/open_clip/model_configs/ViT-gopt-16-SigLIP2-256.json",
    "chars": 823,
    "preview": "{\n    \"embed_dim\": 1536,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViT-gopt-16-SigLIP2-384.json",
    "chars": 823,
    "preview": "{\n    \"embed_dim\": 1536,\n    \"init_logit_bias\": -10,\n    \"custom_text\": true,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-B-LTT.json",
    "chars": 426,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_base_224\",\n      \"timm_model_pretrained\": "
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-B.json",
    "chars": 425,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_base_224\",\n      \"timm_model_pretrained\": "
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-L-256.json",
    "chars": 427,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_large_256\",\n      \"timm_model_pretrained\":"
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-L-336.json",
    "chars": 427,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_large_336\",\n      \"timm_model_pretrained\":"
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-L-384.json",
    "chars": 428,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_large_384\",\n      \"timm_model_pretrained\":"
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-L.json",
    "chars": 427,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_large_224\",\n      \"timm_model_pretrained\":"
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-L2-256.json",
    "chars": 430,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_large2_256\",\n      \"timm_model_pretrained"
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-L2-336.json",
    "chars": 430,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_large2_336\",\n      \"timm_model_pretrained"
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-L2-384.json",
    "chars": 431,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_large2_384\",\n      \"timm_model_pretrained"
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-L2.json",
    "chars": 430,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_large2_224\",\n      \"timm_model_pretrained"
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-S-LTT.json",
    "chars": 427,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_small_224\",\n      \"timm_model_pretrained\":"
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-S.json",
    "chars": 426,
    "preview": "{\n    \"embed_dim\": 384,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_small_224\",\n      \"timm_model_pretrained\":"
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-XL-256.json",
    "chars": 430,
    "preview": "{\n    \"embed_dim\": 1152,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_xlarge_256\",\n      \"timm_model_pretrained"
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-XL-336.json",
    "chars": 430,
    "preview": "{\n    \"embed_dim\": 1152,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_xlarge_336\",\n      \"timm_model_pretrained"
  },
  {
    "path": "src/open_clip/model_configs/ViTamin-XL-384.json",
    "chars": 430,
    "preview": "{\n    \"embed_dim\": 1152,\n    \"vision_cfg\": {\n      \"timm_model_name\": \"vitamin_xlarge_384\",\n      \"timm_model_pretrained"
  },
  {
    "path": "src/open_clip/model_configs/coca_ViT-B-32.json",
    "chars": 659,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 768,\n     "
  },
  {
    "path": "src/open_clip/model_configs/coca_ViT-L-14.json",
    "chars": 664,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 24,\n        \"width\": 1024,\n    "
  },
  {
    "path": "src/open_clip/model_configs/coca_base.json",
    "chars": 669,
    "preview": "{\n    \"embed_dim\": 512,\n    \"multimodal_cfg\": {\n        \"width\": 768,\n        \"context_length\": 76,\n        \"vocab_size\""
  },
  {
    "path": "src/open_clip/model_configs/coca_roberta-ViT-B-32.json",
    "chars": 525,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 768,\n     "
  },
  {
    "path": "src/open_clip/model_configs/convnext_base.json",
    "chars": 421,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"convnext_base\",\n        \"timm_model_pretrained\":"
  },
  {
    "path": "src/open_clip/model_configs/convnext_base_w.json",
    "chars": 422,
    "preview": "{\n    \"embed_dim\": 640,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"convnext_base\",\n        \"timm_model_pretrained\":"
  },
  {
    "path": "src/open_clip/model_configs/convnext_base_w_320.json",
    "chars": 422,
    "preview": "{\n    \"embed_dim\": 640,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"convnext_base\",\n        \"timm_model_pretrained\":"
  },
  {
    "path": "src/open_clip/model_configs/convnext_large.json",
    "chars": 423,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"convnext_large\",\n        \"timm_model_pretrained\""
  },
  {
    "path": "src/open_clip/model_configs/convnext_large_d.json",
    "chars": 420,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"convnext_large\",\n        \"timm_model_pretrained\""
  },
  {
    "path": "src/open_clip/model_configs/convnext_large_d_320.json",
    "chars": 420,
    "preview": "{\n    \"embed_dim\": 768,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"convnext_large\",\n        \"timm_model_pretrained\""
  },
  {
    "path": "src/open_clip/model_configs/convnext_small.json",
    "chars": 422,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"convnext_small\",\n        \"timm_model_pretrained\""
  },
  {
    "path": "src/open_clip/model_configs/convnext_tiny.json",
    "chars": 422,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"convnext_tiny\",\n        \"timm_model_pretrained\""
  },
  {
    "path": "src/open_clip/model_configs/convnext_xlarge.json",
    "chars": 426,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"convnext_xlarge\",\n        \"timm_model_pretraine"
  },
  {
    "path": "src/open_clip/model_configs/convnext_xxlarge.json",
    "chars": 427,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"convnext_xxlarge\",\n        \"timm_model_pretrain"
  },
  {
    "path": "src/open_clip/model_configs/convnext_xxlarge_320.json",
    "chars": 427,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"convnext_xxlarge\",\n        \"timm_model_pretrain"
  },
  {
    "path": "src/open_clip/model_configs/mt5-base-ViT-B-32.json",
    "chars": 305,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 768,\n     "
  },
  {
    "path": "src/open_clip/model_configs/mt5-xl-ViT-H-14.json",
    "chars": 329,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 32,\n        \"width\": 1280,\n   "
  },
  {
    "path": "src/open_clip/model_configs/nllb-clip-base-siglip.json",
    "chars": 509,
    "preview": "{\n    \"embed_dim\": 768,\n    \"custom_text\": true,\n    \"init_logit_bias\": -10,\n    \"vision_cfg\": {\n        \"image_size\": 3"
  },
  {
    "path": "src/open_clip/model_configs/nllb-clip-base.json",
    "chars": 371,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 768,\n     "
  },
  {
    "path": "src/open_clip/model_configs/nllb-clip-large-siglip.json",
    "chars": 512,
    "preview": "{\n    \"embed_dim\": 1152,\n    \"custom_text\": true,\n    \"init_logit_bias\": -10,\n    \"vision_cfg\": {\n        \"image_size\": "
  },
  {
    "path": "src/open_clip/model_configs/nllb-clip-large.json",
    "chars": 399,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 32,\n        \"width\": 1280,\n   "
  },
  {
    "path": "src/open_clip/model_configs/roberta-ViT-B-32.json",
    "chars": 323,
    "preview": "{\n    \"embed_dim\": 512,\n    \"quick_gelu\": true,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n   "
  },
  {
    "path": "src/open_clip/model_configs/swin_base_patch4_window7_224.json",
    "chars": 380,
    "preview": "{\n    \"embed_dim\": 640,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"swin_base_patch4_window7_224\",\n        \"timm_mod"
  },
  {
    "path": "src/open_clip/model_configs/vit_medium_patch16_gap_256.json",
    "chars": 377,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"vit_medium_patch16_gap_256\",\n        \"timm_model"
  },
  {
    "path": "src/open_clip/model_configs/vit_relpos_medium_patch16_cls_224.json",
    "chars": 384,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"timm_model_name\": \"vit_relpos_medium_patch16_cls_224\",\n        \"tim"
  },
  {
    "path": "src/open_clip/model_configs/xlm-roberta-base-ViT-B-32.json",
    "chars": 307,
    "preview": "{\n    \"embed_dim\": 512,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 12,\n        \"width\": 768,\n     "
  },
  {
    "path": "src/open_clip/model_configs/xlm-roberta-large-ViT-H-14.json",
    "chars": 337,
    "preview": "{\n    \"embed_dim\": 1024,\n    \"vision_cfg\": {\n        \"image_size\": 224,\n        \"layers\": 32,\n        \"width\": 1280,\n   "
  },
  {
    "path": "src/open_clip/modified_resnet.py",
    "chars": 9047,
    "preview": "from collections import OrderedDict\nfrom typing import Dict, List, Optional, Union\n\nimport torch\nfrom torch import nn\nfr"
  },
  {
    "path": "src/open_clip/openai.py",
    "chars": 3302,
    "preview": "\"\"\" OpenAI pretrained model functions\n\nAdapted from https://github.com/openai/CLIP. Originally MIT License, Copyright (c"
  },
  {
    "path": "src/open_clip/pos_embed.py",
    "chars": 4044,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n# All rights reserved.\n\n# This source code is licensed under the li"
  },
  {
    "path": "src/open_clip/pretrained.py",
    "chars": 33395,
    "preview": "import copy\nimport hashlib\nimport os\nimport urllib\nimport warnings\nfrom functools import partial\nfrom typing import Dict"
  },
  {
    "path": "src/open_clip/push_to_hf_hub.py",
    "chars": 10698,
    "preview": "import argparse\nimport json\nfrom pathlib import Path\nfrom tempfile import TemporaryDirectory\nfrom typing import Optional"
  }
]

// ... and 29 more files (download for full content)

About this extraction

This page contains the full source code of the mlfoundations/open_clip GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 229 files (7.8 MB), approximately 2.1M tokens, and a symbol index with 455 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!