open_clip

FSA·2024년 3월 23일
0

vision

목록 보기
4/25

  • OpenAI의 CLIP(Contrastive Language-Image Pre-training)을 개방형 소스 구현체로 만나볼 수 있어요.
  • 이 코드베이스를 사용해서, 우리는 다양한 데이터 소스와 컴퓨팅 예산에서 여러 모델을 훈련시켰어요.
  • 소규모 실험부터, LAION-400M, LAION-2B, DataComp-1B와 같은 데이터셋에서 훈련된 모델까지 큰 규모의 실행도 포함되어 있죠.
    • LAION-400M, LAION-2B, DataComp-1B는 인터넷에서 수집된 대규모 이미지와 텍스트 쌍을 포함하는 데이터셋으로, 대규모 언어-이미지 사전 학습(예: CLIP과 같은 모델)에 사용
  • 우리의 모델과 그 스케일링 특성들은, contrastive language-image learning에 대한 재현 가능한 스케일링 법칙이라는 논문에서 자세히 연구되었어요.
  • 몇몇 최고의 모델들과 그들의 제로샷 ImageNet-1k 정확도가 아래에 나와 있으며, OpenAI가 훈련시킨 ViT-L 모델도 포함되어 있어요.
  • 모델별로 추가적인 세부사항을 담은 모델 카드는 Hugging Face Hub에서 OpenCLIP 라이브러리 태그 아래에서 찾아볼 수 있어요:

pip install open_clip_torch

import torch
from PIL import Image
import open_clip

model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', pretrained='laion2b_s34b_b79k')
tokenizer = open_clip.get_tokenizer('ViT-B-32')

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

with torch.no_grad(), torch.cuda.amp.autocast():
    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.]]

사전 훈련된 모델

  • 우리는 사전 훈련된 모델과, 훈련되지 않은 모델을 인스턴스화하기 위한 간단한 모델 인터페이스를 제공
  • 어떤 사전 훈련된 모델들이 있는지 확인하려면, 다음 코드 조각을 사용하세요.
import open_clip
open_clip.list_pretrained()

주의:

  • 많은 기존 체크포인트들은 원래 OpenAI 모델들의 QuickGELU 활성화를 사용
  • 이 활성화는 실제로 최근 버전의 PyTorch에서 native torch.nn.GELU보다 효율이 떨어져요.
  • 모델 기본값은 이제 nn.GELU이므로, OpenCLIP 사전 훈련된 가중치에는 -quickgelu 접미사가 있는 모델 정의를 사용해야 해요.
  • 모든 OpenAI 사전 훈련된 가중치는 항상 QuickGELU를 기본으로 사용할 거예요.
  • 또한 QuickGELU를 사용하는 사전 훈련된 가중치와 함께 non-quickgelu 모델 정의를 사용할 수도 있지만, 정확도가 떨어어져요.
  • 더 긴 실행을 위해 세부 조정을 하면, 그 정확도 차이는 사라질 가능성이 높아요. 앞으로 훈련될 모델들은 nn.GELU를 사용할 거예요.

모델 로딩

  • 모델은 open_clip.create_model_and_transforms를 사용해 로드할 수 있어요.
  • 아래 예시처럼요.
  • 모델 이름과 해당하는 사전 훈련된 키들open_clip.list_pretrained()의 출력과 호환돼요.
# pretrained also accepts local paths
model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', pretrained='laion2b_s34b_b79k') 
  • 사전 훈련된 인자는 로컬 경로도 받을 수 있어요.

분류 작업에 대한 fine-tuning

  • 이 리포지토리는 CLIP 모델을 훈련시키는 데 집중돼 있어요.
  • 이미지넷과 같은 하류 분류 작업에 대해 사전 훈련된 제로샷 모델을 세부 조정하고 싶다면, 다른 리포지토리인 WiSE-FT를 확인해 보세요.
  • WiSE-FT 리포지토리에는 우리가 제로샷 모델의 견고함을 유지하면서 세부 조정하는 기술을 소개한 논문인 Robust Fine-tuning of Zero-shot Models에 대한 코드가 있어요.

데이터

  • 웹데이터셋으로 데이터셋을 다운로드하고 싶다면, img2dataset을 추천해요.

Conceptual Captions

cc3m img2dataset 예시를 참조하세요.

YFCC 및 기타 데이터셋

위에서 언급한 것처럼, CSV 파일을 통해 훈련 데이터를 지정하는 것 외에도, 우리의 코드베이스는 대규모 데이터셋에 권장되는 웹데이터셋도 지원해요. 기대되는 형식은 일련의 .tar 파일이에요. 각 .tar 파일은 각 훈련 예제에 대한 두 개의 파일, 이미지와 해당 텍스트를 포함해야 해요. 두 파일은 동일한 이름을 가져야 하지만 확장자가 달라야 해요. 예를 들어, shard_001.tar는 abc.jpg와 abc.txt 같은 파일을 포함할 수 있어요. 웹데이터셋에 대해 더 알고 싶다면 https://github.com/webdataset/webdataset을 확인하세요. 우리는 tarp를 사용해 생성된 각 데이터 포인트가 1,000개인 .tar 파일을 사용해요.

YFCC 데이터셋은 Multimedia Commons에서 다운로드할 수 있어요. OpenAI와 비슷하게, 우리는 언급된 정확도 숫자에 도달하기 위해 YFCC의 부분 집합을 사용했어요. 이 부분 집합에 있는 이미지의 인덱스는 OpenAI의 CLIP 리포지토리에 있어요.

그 다음, openclip을 설치해서 훈련에 사용할 수 있어요. pip install 'open_clip_torch[training]'을 사용하세요.

Training Clip

개발

코드에 변경을 기여하고 싶다면, openclip을 클론한 다음 가상 환경을 생성한 후 openclip 폴더에서 make install을 실행하세요.

PyTorch를 https://pytorch.org/get-started/locally/ 에 따라 설치하세요.

훈련 관련 의존성을 설치하려면 make install-training을 실행할 수 있어요.

테스트

테스트는 make install-test를 실행한 다음 make test로 실행할 수 있어요.

특정 테스트를 실행하려면, 예를 들어 훈련 관련 테스트만을 실행하고 싶다면, python -m pytest -x -s -v tests -k "training"을 사용하세요.

특정 git 수정이나 태그에 대해 회귀 테스트를 실행하려면:


Training CoCa

  • CoCa 모델을 훈련하는 것은 훈련 스크립트의 --model 파라미터를 사용하여 CoCa 설정을 지정함으로써 가능
  • 현재 사용 가능한 설정에는 "coca_base", "coca_ViT-B-32", 그리고 텍스트 인코더로 RoBERTa를 사용하는 "coca_roberta-ViT-B-32"가 포함됩니다.
  • CoCa 설정은 멀티모달 텍스트 디코더에 대한 파라미터를 지정하는 "multimodal_cfg" 구성 요소가 추가되어 있기 때문에 CLIP 설정과 다릅니다.
  • 여기 coca_ViT-B-32 설정에서의 예시가 있습니다:
"multimodal_cfg": {
	"context_length": 76,
	"vocab_size": 49408,
	"width": 512,
	"heads": 8,
	"layers": 12,
	"latent_dim": 512,
	"attn_pooler_heads": 8
}

Generating text with CoCa

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>", ""))

Fine-tuning CoCa

  • CoCa를 mscoco에 세부 조정하기 위해서는 먼저 데이터셋을 생성해야 합니다.
  • 하나의 방법은 csvdataset을 사용하는 것이고, 아마 가장 간단한 방법은 CLIP_benchmark(https://github.com/LAION-AI/CLIP_benchmark)를 사용하는 것이 될 것입니다.
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") # 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"
)
  • 이것은 open_clip을 사용하여 CoCa를 세부 조정할 수 있는 csv 데이터셋을 생성해야 합니다.
python -m training.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
  • 이것은 일반적인 설정이며, open_clip은 설정할 수 있는 매우 다양한 파라미터들을 가지고 있습니다.
  • python -m training.main --help는 그것들을 보여줄 수 있어야 합니다.
  • 사전 훈련과 비교했을 때 관련된 변경 사항은 두 가지 인자뿐입니다.
--coca-contrastive-loss-weight 0
--coca-caption-loss-weight 1
profile
모든 의사 결정 과정을 지나칠 정도로 모두 기록하고, 나중에 스스로 피드백 하는 것

1개의 댓글

comment-user-thumbnail
2024년 3월 23일

안녕하세요~웹사이트 솔루션이대해 조언을 구하고싶은데 ㅠㅠ혹시 실례지만 카톡 thegood12 한통주실수있나요~ 광고그런거아니에용~ㅠㅠ정말공부하는데 부족해서 물어보고싶어서 ㅠㅠ그래용

답글 달기