[กระดาษ] [การอ้างอิง] [Clip Colab] [Coca Colab]
ยินดีต้อนรับสู่การใช้งานคลิปโอเพ่นซอร์สของ OpenAi
ด้วยการใช้ codebase นี้เราได้ฝึกอบรมหลายรุ่นเกี่ยวกับแหล่งข้อมูลที่หลากหลายและการคำนวณงบประมาณตั้งแต่การทดลองขนาดเล็กไปจนถึงการวิ่งที่ใหญ่ขึ้นรวมถึงรุ่นที่ผ่านการฝึกอบรมในชุดข้อมูลเช่น LAION-400M, LAION-2B และ DataComp-1B โมเดลของเราและคุณสมบัติการปรับขนาดของพวกเขาได้รับการศึกษาอย่างละเอียดในกฎหมายการปรับขนาดที่ทำซ้ำได้สำหรับการเรียนรู้ภาพภาพภาษาที่แตกต่างกัน โมเดลที่ดีที่สุดบางรุ่นที่เราได้รับการฝึกฝนและความแม่นยำของ Imagenet-1K แบบไม่ถ่ายภาพของพวกเขาแสดงอยู่ด้านล่างพร้อมกับรุ่น VIT-L ที่ได้รับการฝึกฝนโดย OpenAI และทางเลือกอื่น ๆ ที่ล้ำสมัย (ทั้งหมดสามารถโหลดผ่าน OpenCLip) เราให้รายละเอียดเพิ่มเติมเกี่ยวกับคอลเลกชันเต็มรูปแบบของเราที่ได้รับการฝึกฝนที่นี่และผลลัพธ์ที่ไม่ได้-ช็อตสำหรับชุดข้อมูล 38 ชุดที่นี่
| แบบอย่าง | ข้อมูลการฝึกอบรม | ปณิธาน | # ของตัวอย่างที่เห็น | ImageNet Zero-shot ACC |
|---|---|---|---|---|
| ยึดฐาน | LAION-2B | 256px | 13B | 71.5% |
| มีขนาดใหญ่ | LAION-2B | 320px | 29b | 76.9% |
| convnext-xxlarge | LAION-2B | 256px | 34B | 79.5% |
| Vit-B/32 | 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-G/14 | LAION-2B | 224px | 34B | 80.1% |
| VIT-L/14 (คลิปดั้งเดิม) | ปัญญา | 224px | 13B | 75.5% |
| VIT-SO400M/14 (SIGLIP) | Webli | 224px | 45B | 82.0% |
| VIT-SO400M-14-SIGLIP-384 (SIGLIP) | Webli | 384px | 45B | 83.1% |
| VIT-H/14-QUICKGELU (DFN) | DFN-5B | 224px | 39b | 83.4% |
| VIT-H-14-378-QUICKGELU (DFN) | DFN-5B | 378px | 44B | 84.4% |
การ์ดรุ่นที่มีรายละเอียดเฉพาะรุ่นเพิ่มเติมสามารถพบได้บน Hugging Face Hub ภายใต้แท็ก OpenClip Library: https://huggingface.co/models?library=open_clip
หากคุณพบว่าที่เก็บนี้มีประโยชน์โปรดพิจารณาอ้างถึง เรายินดีต้อนรับทุกคนที่จะส่งปัญหาหรือส่งอีเมลหากคุณมีคำขอหรือคำแนะนำอื่น ๆ
โปรดทราบว่าส่วนของ src/open_clip/ Modeling และรหัสโทเค็นเป็นการปรับตัวของที่เก็บอย่างเป็นทางการของ OpenAI
| เครดิตรูปภาพ: https://github.com/openai/clip |
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' )
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 . 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.]]ดูเพิ่มเติมที่ [Clip Colab]
ในการคำนวณการฝังตัวหลายพันล้านครั้งอย่างมีประสิทธิภาพคุณสามารถใช้คลิปรีทรีฟท์ซึ่งมีการสนับสนุน openclip
เรานำเสนออินเทอร์เฟซโมเดลอย่างง่ายเพื่อยกตัวอย่างทั้งรุ่นก่อนและไม่ผ่านการฝึกอบรม หากต้องการดูว่ามีรุ่นใดที่มีอยู่ให้ใช้ตัวอย่างโค้ดต่อไปนี้ รายละเอียดเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกอบรมของเรามีอยู่ที่นี่
> >> import open_clip
> >> open_clip . list_pretrained ()คุณสามารถค้นหาเพิ่มเติมเกี่ยวกับโมเดลที่เราสนับสนุน (เช่นจำนวนพารามิเตอร์, flops) ในตารางนี้
หมายเหตุ: จุดตรวจที่มีอยู่จำนวนมากใช้การเปิดใช้งาน QuickGelu จากรุ่น OpenAI ดั้งเดิม การเปิดใช้งานนี้มีประสิทธิภาพน้อยกว่า Native Torch.nn.gelu ใน Pytorch เวอร์ชันล่าสุด ตอนนี้ค่าเริ่มต้นของโมเดลคือ nn.gelu ดังนั้นหนึ่งควรใช้คำจำกัดความของรุ่นกับ -quickgelu postfix สำหรับน้ำหนักที่ได้รับการปรับแต่ง openclip น้ำหนักที่ได้รับการฝึกอบรมทั้งหมดของ Openai จะเริ่มต้นเป็น QuickGelu เสมอ นอกจากนี้ยังสามารถใช้คำจำกัดความโมเดลที่ไม่ใช่ -quickgelu ที่มีน้ำหนักที่ได้รับการฝึกฝนโดยใช้ Quickgelu แต่จะมีการลดลงอย่างแม่นยำสำหรับการปรับแต่งที่น่าจะหายไปนานขึ้น โมเดลที่ผ่านการฝึกอบรมในอนาคตจะใช้ nn.gelu
โมเดลสามารถโหลดได้ด้วย open_clip.create_model_and_transforms ดังแสดงในตัวอย่างด้านล่าง ชื่อรุ่นและปุ่ม pretrained ที่สอดคล้องกันเข้ากันได้กับเอาต์พุตของ open_clip.list_pretrained()
อาร์กิวเมนต์ pretrained ยังยอมรับเส้นทางท้องถิ่นเช่น /path/to/my/b32.pt คุณยังสามารถโหลดจุดตรวจจาก HuggingFace ด้วยวิธีนี้ pretrained=/path/to/open_clip_pytorch_model.bin ต้องการทำเช่นนั้นให้ดาวน์โหลดไฟล์ open_clip_pytorch_model.bin (ตัวอย่างเช่น https://huggingface.co/laion/clip-vit-l-14-datacomp.xl-s13b-b90k/tree/main)
# pretrained also accepts local paths
model , _ , preprocess = open_clip . create_model_and_transforms ( 'ViT-B-32' , pretrained = 'laion2b_s34b_b79k' ) ที่เก็บนี้มุ่งเน้นไปที่แบบจำลองคลิปการฝึกอบรม ในการปรับแต่งโมเดล Zero-shot ที่ผ่านการฝึกอบรม ในงานการจำแนกประเภทดาวน์สตรีมเช่น ImageNet โปรดดูที่เก็บอื่น ๆ ของเรา: Wise-FT พื้นที่เก็บข้อมูล Wise-FT มีรหัสสำหรับกระดาษของเราเกี่ยวกับการปรับจูนแบบจำลองที่แข็งแกร่งของรุ่น Zero-shot ซึ่งเราแนะนำเทคนิคสำหรับการปรับแต่งรุ่น Zero-shot อย่างละเอียดในขณะที่รักษาความแข็งแกร่งภายใต้การเปลี่ยนแปลงการกระจาย
ในการดาวน์โหลดชุดข้อมูลเป็น WebDataset เราขอแนะนำ IMG2Dataset
ดูตัวอย่าง CC3M IMG2Dataset
นอกเหนือจากการระบุข้อมูลการฝึกอบรมผ่านไฟล์ CSV ตามที่กล่าวไว้ข้างต้น Codebase ของเรายังรองรับ WebDataset ซึ่งแนะนำสำหรับชุดข้อมูลขนาดใหญ่ รูปแบบที่คาดหวังคือชุดไฟล์. .tar ไฟล์ .tar เหล่านี้แต่ละไฟล์ควรมีสองไฟล์สำหรับแต่ละตัวอย่างการฝึกอบรมหนึ่งไฟล์สำหรับรูปภาพและไฟล์สำหรับข้อความที่เกี่ยวข้อง ไฟล์ทั้งสองควรมีชื่อเดียวกัน แต่ส่วนขยายที่แตกต่างกัน ตัวอย่างเช่น shard_001.tar อาจมีไฟล์เช่น abc.jpg และ abc.txt คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ webdataset ได้ที่ https://github.com/webdataset/webdataset เราใช้ไฟล์ .tar ที่มีจุดข้อมูล 1,000 จุดแต่ละจุดซึ่งเราสร้างโดยใช้ผ้าใบกันน้ำ
คุณสามารถดาวน์โหลดชุดข้อมูล YFCC จากมัลติมีเดียคอมมอนส์ เช่นเดียวกับ OpenAI เราใช้ชุดย่อยของ YFCC เพื่อเข้าถึงตัวเลขความแม่นยำดังกล่าวข้างต้น ดัชนีของภาพในชุดย่อยนี้อยู่ในที่เก็บคลิปของ Openai
เราแนะนำให้คุณสร้างสภาพแวดล้อมเสมือนจริงก่อน:
python3 -m venv .env
source .env/bin/activate
pip install -U pip
จากนั้นคุณสามารถติดตั้ง OpenClip สำหรับการฝึกอบรมด้วย pip install 'open_clip_torch[training]'
หากคุณต้องการทำการเปลี่ยนแปลงเพื่อสนับสนุนรหัสคุณสามารถโคลน OpenClip จากนั้นเรียกใช้ make install ในโฟลเดอร์ OpenClip (หลังจากสร้าง VirtualEnv)
ติดตั้ง pip pytorch ตาม https://pytorch.org/get-started/locally/
คุณสามารถเรียก make install-training เพื่อติดตั้ง deps การฝึกอบรม
การทดสอบสามารถทำงานได้ด้วย make install-test จากนั้น make test
python -m pytest -x -s -v tests -k "training" เพื่อเรียกใช้การทดสอบเฉพาะ
การเรียกใช้การทดสอบการถดถอยกับการแก้ไขหรือแท็ก GIT เฉพาะ:
สร้างข้อมูลการทดสอบ
python tests/util_test.py --model RN50 RN101 --save_model_list models.txt --git_revision 9d31b2ec4df6d8228f370ff20c8267ec6ba39383 คำเตือน : สิ่งนี้จะเรียกใช้ Git และแก้ไขแผนผังการทำงานของคุณ แต่จะรีเซ็ตเป็นสถานะปัจจุบันหลังจากสร้างข้อมูลแล้ว!
อย่าแก้ไขแผนผังทำงานของคุณในขณะที่ข้อมูลทดสอบกำลังถูกสร้างขึ้นด้วยวิธีนี้
เรียกใช้การทดสอบการถดถอย
OPEN_CLIP_TEST_REG_MODELS=models.txt python -m pytest -x -s -v -m regression_testpython -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 หมายเหตุ: imagenet-val เป็นเส้นทางไปสู่ชุด การตรวจสอบความถูกต้อง ของ ImageNet สำหรับการประเมินค่าศูนย์ไม่ใช่ชุดการฝึกอบรม! คุณสามารถลบอาร์กิวเมนต์นี้ได้หากคุณไม่ต้องการทำการประเมินผลเป็นศูนย์ใน ImageNet ตลอดการฝึกอบรม โปรดทราบว่าโฟลเดอร์ val ควรมีโฟลเดอร์ย่อย หากไม่เป็นเช่นนั้นโปรดใช้สคริปต์นี้
รหัสนี้ได้รับการทดสอบการต่อสู้สูงสุด 1024 A100s และเสนอโซลูชั่นที่หลากหลายสำหรับการฝึกอบรมแบบกระจาย เรารวมการสนับสนุนพื้นเมืองสำหรับกลุ่ม slurm
เนื่องจากจำนวนอุปกรณ์ที่ใช้ในการฝึกอบรมการเพิ่มขึ้นความซับซ้อนของพื้นที่ของเมทริกซ์ logit การใช้รูปแบบการรวบรวมทั้งหมดที่ไร้เดียงสาความซับซ้อนของพื้นที่จะเป็น O(n^2) แต่ความซับซ้อนอาจกลายเป็นเส้นตรงได้อย่างมีประสิทธิภาพหากมีการใช้ธง --gather-with-grad และ --local-loss การเปลี่ยนแปลงนี้ส่งผลให้ผลลัพธ์เชิงตัวเลขแบบหนึ่งต่อหนึ่งเป็นวิธีnaïve
สำหรับชุดข้อมูลขนาดใหญ่ (เช่น LAION2B) เราขอแนะนำให้ตั้งค่า --train-num-samples ที่ต่ำกว่ายุคเต็มตัวอย่าง --train-num-samples 135646078 ถึง 1/16 ของยุคร่วมกับ --dataset-resampled เพื่อทำการสุ่มตัวอย่าง สิ่งนี้จะช่วยให้มีจุดตรวจสอบบ่อยครั้งในการประเมินบ่อยขึ้น
การวิจัยล่าสุดแสดงให้เห็นว่าหนึ่งสามารถออกกลางคันได้ครึ่งหนึ่งถึงสามในสี่ของโทเค็นภาพซึ่งนำไปสู่ความเร็วในการฝึกอบรมสูงสุด 2-3x โดยไม่สูญเสียความแม่นยำ
คุณสามารถตั้งค่าสิ่งนี้ในการกำหนดค่า Transformer Visual ของคุณด้วยคีย์ patch_dropout
ในกระดาษพวกเขายัง finetuned โดยไม่มีการออกกลางคันในตอนท้าย คุณสามารถทำได้ด้วยอาร์กิวเมนต์บรรทัดคำสั่ง --force-patch-dropout 0.
OpenClip รองรับการใช้แหล่งข้อมูลหลายแหล่งโดยแยกเส้นทางข้อมูลที่แตกต่างกันด้วย :: ตัวอย่างเช่นในการฝึกอบรมบน CC12M และบน Laion เราอาจใช้ --train-data "/data/cc12m/cc12m-train-{0000..2175}.tar::/data/LAION-400M/{00000..41455}.tar" แนะนำให้ใช้ --dataset-resampled สำหรับกรณีเหล่านี้
โดยค่าเริ่มต้นตามความคาดหวังจำนวนครั้งที่โมเดลจะเห็นตัวอย่างจากแต่ละแหล่งที่มานั้นเป็นสัดส่วนกับขนาดของแหล่งที่มา ตัวอย่างเช่นเมื่อการฝึกอบรมเกี่ยวกับแหล่งข้อมูลเดียวที่มีขนาด 400 ม. และอีกอันที่มีขนาด 10 ม. ตัวอย่างจากแหล่งแรกมีแนวโน้มที่จะเห็นได้มากกว่า 40 เท่าในความคาดหวัง
นอกจากนี้เรายังรองรับการถ่วงน้ำหนักที่แตกต่างกันของแหล่งข้อมูลโดยใช้ธง --train-data-upsampling-factors ตัวอย่างเช่นการใช้ --train-data-upsampling-factors=1::1 ในสถานการณ์ข้างต้นเทียบเท่ากับการไม่ใช้ธงและ --train-data-upsampling-factors=1::2 เทียบเท่ากับการเพิ่มแหล่งข้อมูลที่สองสองครั้ง หากคุณต้องการสุ่มตัวอย่างจากแหล่งข้อมูลที่มีความถี่เท่ากันปัจจัยการสุ่มตัวอย่างควรเป็นสัดส่วนผกผันกับขนาดของแหล่งข้อมูล ตัวอย่างเช่นหากชุดข้อมูล A มีตัวอย่าง 1,000 ตัวอย่างและชุดข้อมูล B มี 100 ตัวอย่างคุณสามารถใช้ --train-data-upsampling-factors=0.001::0.01 --train-data-upsampling-factors=1::10 หรือแบบอะนาล็อก
เราใช้ประโยชน์จาก torchrun เพื่อเปิดงานแบบกระจาย ต่อไปนี้เปิดตัวงาน A บนโหนด 4 GPU:
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/สคริปต์เดียวกันข้างต้นใช้งานได้ตราบใดที่ผู้ใช้มีข้อมูลเกี่ยวกับจำนวนโหนดและโหนดโฮสต์
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/นี่น่าจะเป็นทางออกที่ง่ายที่สุดในการใช้งาน สคริปต์ต่อไปนี้ใช้ในการฝึกอบรมโมเดลที่ใหญ่ที่สุดของเรา:
#! /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-gradpython -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 โมเดลการฝึกอบรม Coca เปิดใช้งานผ่านการระบุการกำหนดค่า Coca โดยใช้พารามิเตอร์ --model โมเดลของสคริปต์การฝึกอบรม การกำหนดค่าที่มีอยู่ในปัจจุบันคือ "coca_base", "coca_vit-b-32" และ "coca_roberta-vit-b-32" (ซึ่งใช้ Roberta เป็นตัวเข้ารหัสข้อความ) การกำหนดค่า Coca นั้นแตกต่างจาก Clip Configs เนื่องจากมีส่วนประกอบ "Multimodal_CFG" เพิ่มเติมซึ่งระบุพารามิเตอร์สำหรับตัวถอดรหัสข้อความหลายรูปแบบ นี่คือตัวอย่างจาก coca_vit-b-32 config:
"multimodal_cfg" : {
"context_length" : 76 ,
"vocab_size" : 49408 ,
"width" : 512 ,
"heads" : 8 ,
"layers" : 12 ,
"latent_dim" : 512 ,
"attn_pooler_heads" : 8
}เครดิตเป็น lucidrains สำหรับรหัสเริ่มต้น gpucce สำหรับการปรับรหัสเป็น open_clip และ IEJMAC สำหรับการฝึกอบรมโมเดล
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>" , "" ))ดูเพิ่มเติมที่ [Coca Colab]
ในการปรับแต่ง Coca บน MSCOCO ก่อนอื่นให้สร้างชุดข้อมูลวิธีหนึ่งคือการใช้ CSVDataset และอาจเป็นวิธีที่ง่ายที่สุดในการทำมันคือการใช้ clip_benchmark ซึ่งใช้ pycocotools (ซึ่งสามารถใช้ด้วยตัวเอง)
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 "
)สิ่งนี้ควรสร้างชุดข้อมูล CSV ที่สามารถใช้เพื่อปรับแต่ง Coca ด้วย open_clip
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 นี่คือการตั้งค่าทั่วไป open_clip มีพารามิเตอร์ที่สามารถตั้งค่าได้ python -m open_clip_train.main --help ควรแสดง การเปลี่ยนแปลงที่เกี่ยวข้องเพียงอย่างเดียวเมื่อเทียบกับการฝึกอบรมล่วงหน้าคือข้อโต้แย้งสองข้อ
--coca-contrastive-loss-weight 0
--coca-caption-loss-weight 1ซึ่งทำให้แบบจำลองฝึกอบรมด้านการกำเนิดเท่านั้น
หากคุณต้องการใช้โมเดลภาษาที่แตกต่างกันเป็นตัวเข้ารหัสข้อความสำหรับคลิปคุณสามารถทำได้โดยใช้หนึ่งในรูปแบบ --model กอด --hf-tokenizer-name ใบหน้าใน src/open_clip/model_configs ขณะนี้เรารองรับ Roberta ("Test-Roberta" Config) เท่านั้น แต่การเพิ่มรุ่นใหม่ควรเป็นเรื่องเล็กน้อย นอกจากนี้คุณยังสามารถกำหนดจำนวนเลเยอร์จากจุดสิ้นสุดเพื่อปล่อยให้ไม่ได้รับการปลดปล่อยด้วยพารามิเตอร์ --lock-text-unlocked-layers นี่คือคำสั่งตัวอย่างในการฝึกคลิปกับ Roberta LM ที่มี 10 ชั้นสุดท้าย Unfrozen:
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 " เมื่อทำงานบนเครื่องที่มี 8 GPU คำสั่งควรสร้างเส้นโค้งการฝึกอบรมต่อไปนี้สำหรับคำอธิบายภาพแนวคิด:
เส้นโค้งโดยละเอียดเพิ่มเติมสำหรับคำอธิบายภาพแนวคิดจะได้รับที่ /docs/clip_conceptual_captions.md
เมื่อฝึก RN50 บน YFCC จะใช้พารามิเตอร์ไฮเปอร์พารามิเตอร์เดียวกับข้างต้นยกเว้น lr=5e-4 และ epochs=32
โปรดทราบว่าการใช้รุ่นอื่นเช่น ViT-B/32 หรือ RN50x4 หรือ RN50x16 หรือ ViT-B/16 ระบุด้วย --model RN50x4
สำหรับการบันทึก tensorboard ให้เรียกใช้:
tensorboard --logdir=logs/tensorboard/ --port=7777 สำหรับการบันทึก Wandb เราขอแนะนำให้ดูที่ตัวแปร step แทน Step เนื่องจากไม่ได้ตั้งค่าในภายหลังในรุ่นก่อนหน้าของ codebase นี้ สำหรับการทำงานที่เก่ากว่าด้วยรุ่นที่ผ่านการฝึกอบรมก่อน #613 ควรละเว้นตัวแปร Step สำหรับการวิ่งใหม่หลังจากการประชาสัมพันธ์นั้นตัวแปรทั้งสองจะเหมือนกัน
เราขอแนะนำให้ https://github.com/laion-ai/clip_benchmark#how-to-use สำหรับการประเมินอย่างเป็นระบบในชุดข้อมูล 40 ชุด
python -m open_clip_train.main
--val-data= " /path/to/validation_data.csv "
--model RN101
--pretrained /path/to/checkpoints/epoch_K.ptpython -m open_clip_train.main
--imagenet-val /path/to/imagenet/validation
--model ViT-B-32-quickgelu
--pretrained laion400m_e32 คุณสามารถกลั่นจากการฝึกอบรมล่วงหน้าได้โดยใช้ --distill-model และ --distill-pretrained เพื่อระบุรูปแบบที่คุณต้องการกลั่นจาก ตัวอย่างเช่นการกลั่นจากการใช้ OpenAI VIT-L/14 --distill-model ViT-L-14 --distill-pretrained openai
เพื่อจำลองการใช้แบทช์ขนาดใหญ่ --accum-freq k หากขนาดแบทช์ GPU- --batch-size คือ m แล้วขนาดแบทช์ที่มีประสิทธิภาพจะเป็น k * m * num_gpus
เมื่อเพิ่มขึ้น --accum-freq จากค่าเริ่มต้นที่ 1 ตัวอย่าง/s จะยังคงค่าคงที่โดยประมาณ (ขนาดแบทช์จะเพิ่มเป็นสองเท่าตามเวลาต่อแบทช์) ขอแนะนำให้ใช้คุณสมบัติอื่น ๆ เพื่อลดขนาดแบทช์เช่น --grad-checkpointing --local-loss --gather-with-grad ก่อนที่จะเพิ่ม --accum-freq -สามารถใช้งาน --accum-freq นอกเหนือจากคุณสมบัติเหล่านี้
แทนที่จะเป็น 1 pass ต่อตัวอย่างตอนนี้มี 2 pass ต่อตัวอย่างต่อตัวอย่าง อย่างไรก็ตามสิ่งแรกทำด้วย torch.no_grad
มีหน่วยความจำ GPU เพิ่มเติมบางอย่าง --- คุณสมบัติและข้อมูลจากแบทช์ m ทั้งหมดจะถูกเก็บไว้ในหน่วยความจำ
นอกจากนี้ยังมีการคำนวณการสูญเสีย m แทน 1 ปกติ
สำหรับข้อมูลเพิ่มเติมโปรดดู Cui และคณะ (https://arxiv.org/abs/2112.09331) หรือ Pham et al (https://arxiv.org/abs/2111.10050)
เรามีการสนับสนุนเบต้าสำหรับการฝึกอบรม INT8 และการอนุมาน คุณสามารถเปิดใช้งานการฝึกอบรม INT8 ด้วย --use-bnb-linear SwitchBackLinearGlobal หรือ --use-bnb-linear SwitchBackLinearGlobalMemEfficient โปรดดูไลบรารี Bitsandbytes สำหรับคำจำกัดความสำหรับเลเยอร์เหล่านี้ สำหรับคลิป Vit-Huge ในปัจจุบันควรสอดคล้องกับการเร่งความเร็วการฝึกอบรม 10% โดยไม่มีการสูญเสียความแม่นยำ การเร่งความเร็วมากขึ้นจะเกิดขึ้นเมื่อชั้นความสนใจถูก refactored เพื่อให้เลเยอร์เชิงเส้นถูกแทนที่ด้วยเช่นกัน
ดูบทช่วยสอน https://github.com/mlfoundations/open_clip/blob/main/tutorials/int8_tutorial.ipynb หรือกระดาษ
เป็นไปได้เสมอที่จะกลับมาทำงานโดยตรงจากไฟล์ระยะไกลเช่นไฟล์ในถัง S3 เพียงแค่ตั้ง --resume s3://<path-to-checkpoint> สิ่งนี้จะทำงานกับระบบไฟล์ใดก็ได้ที่สนับสนุนโดย fsspec
นอกจากนี้ยังเป็นไปได้ที่จะฝึกอบรมโมเดล open_clip ในขณะที่สำรองข้อมูลอย่างต่อเนื่องถึง S3 สิ่งนี้สามารถช่วยหลีกเลี่ยงระบบไฟล์ท้องถิ่นที่ช้า
สมมติว่าโหนดของคุณมี SSD /scratch ในเครื่อง, S3 Bucket s3://<path-to-bucket>
ในกรณีนั้นตั้ง --logs /scratch และ --remote-sync s3://<path-to-bucket> จากนั้นกระบวนการพื้นหลังจะซิงค์ /scratch/<run-name> ถึง s3://<path-to-bucket>/<run-name> หลังจากการซิงค์กระบวนการพื้นหลังจะนอนหลับเป็นเวลาไม่กี่วินาที --remote-sync-frequency ซึ่งเริ่มต้นเป็น 5 นาที
นอกจากนี้ยังมีการสนับสนุนการทดลองสำหรับการซิงค์กับระบบไฟล์ระยะไกลอื่น ๆ ไม่ใช่แค่ S3 หากต้องการทำเช่นนั้นให้ระบุ --remote-sync-protocol fsspec อย่างไรก็ตามในปัจจุบันนี้ช้ามากและไม่แนะนำ
นอกจากนี้หากต้องการหลีกเลี่ยงการบันทึกจุดตรวจสอบมากเกินไปในเครื่องเมื่อใช้คุณสมบัติเหล่านี้คุณสามารถใช้ --delete-previous-checkpoint ซึ่งลบจุดตรวจสอบก่อนหน้านี้หลังจากบันทึกใหม่
หมายเหตุ: หากคุณใช้คุณสมบัตินี้กับ --resume latest มีคำเตือนไม่กี่คำ ขั้นแรกให้ใช้กับ --save-most-recent ประการที่สองรองรับ s3 เท่านั้น ในที่สุดเนื่องจากการซิงค์เกิดขึ้นในพื้นหลังเป็นไปได้ว่าจุดตรวจสอบล่าสุดอาจไม่เสร็จสิ้นการซิงค์กับรีโมท
โมดูล open_clip.push_to_hf_hub มีผู้ช่วยสำหรับการผลักดันรุ่น /w น้ำหนักและกำหนดค่าไปยังฮับ HF
เครื่องมือสามารถเรียกใช้จากบรรทัดคำสั่ง, 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
เรารับทราบอย่างขอบคุณศูนย์ Gauss สำหรับ Supercomputing EV (www.gauss-centre.eu) สำหรับการระดมทุนส่วนนี้ของการทำงานโดยการให้เวลาในการคำนวณผ่านสถาบัน John Von Neumann สำหรับคอมพิวเตอร์ (NIC) บน GCS SuperComputer Juwels Booster ที่Jülich Supercomputing Center (JSC)
การพัฒนาปัจจุบันของที่เก็บนี้นำโดย Ross Wightman, Romain Beaumont, Cade Gordon และ Vaishaal Shankar
เวอร์ชันดั้งเดิมของที่เก็บนี้มาจากกลุ่มนักวิจัยที่ UW, Google, Stanford, Amazon, Columbia และ Berkeley
Gabriel Ilharco*, Mitchell Wortsman*, Nicholas Carlini, Rohan Taori, Achal Dave, Vaishaal Shankar, John Miller, Hongseok Namkoong, Hannaneh Hajishirzi, Ali Farhadi
ขอขอบคุณเป็นพิเศษสำหรับ Jong Wook Kim และ Alec Radford สำหรับความช่วยเหลือในการทำซ้ำคลิป!
หากคุณพบว่าที่เก็บนี้มีประโยชน์โปรดพิจารณาอ้าง:
@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 }
} @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 }
} @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 }
} @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 }
}