オープンソースの事前トレーニングフレームワーク MMPRETRAIN 公式ドキュメント (概要、環境のインストールと検証、基本的なユーザーガイド)

MMPretrain は、新しくアップグレードされたオープンソースの事前トレーニング フレームワークです。複数の強力な事前トレーニング済みバックボーンを提供し、さまざまな事前トレーニング戦略をサポートすることを目指しています。MMPretrain は、有名なオープン ソース プロジェクト MMClassification および MMSelfSup から派生し、多くのエキサイティングな新機能を開発しました。現在、視覚認識には事前トレーニング段階が非常に重要です。豊富で強力な事前トレーニング済みモデルにより、現在、さまざまな下流のビジョンタスクを改善することができます。

私たちのコードベースの主な目標は、アクセスしやすくユーザーフレンドリーなライブラリとなり、研究とエンジニアリングを簡素化することです。MMPretrain のさまざまな部分のプロパティと設計について詳しく説明します。

1. MMPretrain 実践ロードマップ

ここに画像の説明を挿入

ユーザーが MMPretrain をすぐに使い始められるように、ライブラリ用に作成した実用的なロードマップに従うことをお勧めします。

(1) MMPretrain を試してみたいユーザーは、環境設定を理解するために「はじめに」セクションを読むことをお勧めします。

(2) 基本的な使用については、ユーザー ガイドを参照して、さまざまなアルゴリズムを利用して事前トレーニング済みモデルを取得し、下流タスクでのパフォーマンスを評価することをお勧めします。

(3) 独自のアルゴリズムをカスタマイズしたい方のために、コードを変更するためのヒントやルールを含む高度なガイドを提供します。

(4) 必要な事前トレーニング モデルを見つけるには、さまざまなバックボーンおよび事前トレーニング方法とさまざまなアルゴリズムの紹介をまとめた ModelZoo をチェックしてください。

(5) さらに、アルゴリズムの診断に役立つ分析および視覚化ツールを提供します。

2. 環境構築とインストール

1. 前提条件

このセクションでは、PyTorch を使用して環境を準備する方法を説明します。
MMPretrain は、Linux、Windows、および macOS で使用できます。Python 3.7 以降、CUDA 10.2 以降、および PyTorch 1.8 以降が必要です。

2. インストール

创建conda环境并激活。
conda create --name mmpretrain python=3.8 -y  #创建环境
conda activate mmpretrain   #激活环境            
conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch  #安装 PyTorch and torchvision (官方)

#如果网不好,可以这样安装
pip3 install torch==1.8.2+cu102 torchvision==0.9.2+cu102 torchaudio===0.8.2 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html  -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

#验证是否安装成功

>>> import torchvision
>>> import torch
>>> import.__version__
  File "<stdin>", line 1
    import.__version__
          ^
SyntaxError: invalid syntax
>>> torch.__version__
'1.8.2+cu102'

3. ソースから mmpretrain をインストールする

この場合、ソースから mmpretrain をインストールします。

git clone https://github.com/open-mmlab/mmpretrain.git
cd mmpretrain
pip install -U openmim && mim install -e .  -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html  -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
git clone https://github.com/open-mmlab/mmpretrain.git
cd mmpretrain
pip install -U openmim  -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html  -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
mim install -e .

「-e」はプロジェクトを編集可能モードでインストールすることを意味するため、コードに加えられたローカル変更は再インストールしなくても有効になります。
ここに画像の説明を挿入
マルチモーダル サポートのインストール (オプション)
MMPretrain のマルチモーダル モデルには追加の依存関係が必要です。これらの依存関係をインストールするには、インストール中に [multimodal] を追加します。例えば:

# Install from source
mim install -e ".[multimodal]"

# Install as a Python package
mim install "mmpretrain[multimodal]>=1.0.0rc8"

3. インストールを確認する

MMPretrain が正しくインストールされていることを確認するために、推論デモを実行するためのサンプル コードが提供されています。
オプション (a)。mmpretrain をソースからインストールした場合は、次のコマンドを実行するだけです。

python demo/image_demo.py demo/demo.JPEG resnet18_8xb32_in1k --device cpu

pred_label、pred_score、pred_class オプションを含む出力辞書がターミナルに表示されます
ここに画像の説明を挿入
(b)。mmpretrain を Python パッケージとしてインストールした場合は、Python インタープリターを開き、次のコードをコピーして貼り付けます。

from mmpretrain import get_model, inference_model

model = get_model('resnet18_8xb32_in1k', device='cpu')  # or device='cuda:0'
inference_model(model, 'demo/demo.JPEG')

予測されたラベル、スコア、クラス名を含む印刷された辞書が表示されます。

知らせ

ここで、resnet18_8xb32_in1k はモデル名です。mmpretrain.list_models を使用してすべてのモデルを探索するか、モデル ズーの概要でモデルを検索できます。

3. 構成を理解する

深層学習の実験でさまざまな構成を管理するために、構成ファイルを使用してこれらすべての構成を記録します。構成システムはモジュール式および継承設計を採用しており、より詳細な情報は MMEngine のチュートリアルを参照してください。

通常、構成ファイルとして Python ファイルを使用します。すべての構成ファイルは configs フォルダーの下に配置され、ディレクトリ構造は次のとおりです。

MMPretrain/
    ├── configs/
    │   ├── _base_/                       # primitive configuration folder,基本配置文件夹
    │   │   ├── datasets/                      # primitive datasets,基本数据集
    │   │   ├── models/                        # primitive models,基本模型
    │   │   ├── schedules/                     # primitive schedules,基本学习率
    │   │   └── default_runtime.py             # primitive runtime setting,基本运行设置
    │   ├── beit/                         # BEiT Algorithms Folder,BEiT
    │   ├── mae/                          # MAE Algorithms Folder,MAE 算法文件夹
    │   ├── mocov2/                       # MoCoV2 Algorithms Folder,MoCoV2算法文件夹
    │   ├── resnet/                       # ResNet Algorithms Folder
    │   ├── swin_transformer/             # Swin Algorithms Folder
    │   ├── vision_transformer/           # ViT Algorithms Folder
    │   ├── ...
    └── ...

構成ファイルを検査したい場合は、 を実行して完全な構成を確認できます。

python tools/misc/print_config.py /PATH/TO/CONFIG

この記事では、主に設定ファイルの構造と、既存の設定ファイルを基に変更する方法について説明します。ResNet50 構成ファイルを例として、1 行ずつ説明します。

1. 構成構造

フォルダー内には4 つの基本的なコンポーネント ファイル configs/ baseがあります。つまり、
モデル、
データセット
、スケジュール、
ランタイムです。

フォルダー内のすべての構成ファイル _base_ を元の構成ファイルと呼びます。オリジナルのプロファイルを継承することで、トレーニングプロファイルを簡単に構築できます。
理解を容易にするために、ResNet50 構成ファイルを例として取り上げ、各行にコメントを付けます。

_base_ = [                                    # This config file will inherit all config files in `_base_`.
    '../_base_/models/resnet50.py',           # model settings
    '../_base_/datasets/imagenet_bs32.py',    # data settings
    '../_base_/schedules/imagenet_bs256.py',  # schedule settings
    '../_base_/default_runtime.py'            # runtime settings
]

1. 機種設定

この元の構成ファイルには、主にネットワーク構造や損失関数などの情報を含む dict 変数モデルが含まれています

タイプ:

構築するモデルの種類に応じて、さまざまなタスクをサポートします。画像分類タスクの場合、通常、ImageClassifier の詳細についてはAPI ドキュメント
を参照してください。自己教師あり学習には、MoCoV2、BEiT、MAE などのいくつかの SelfSupervisor があります。詳細については、API ドキュメントを参照してください。画像取得タスク (通常は ImageToImageRetriever ) の詳細については、API ドキュメントを参照してください。

通常、type フィールドを使用してコンポーネントのクラスを指定し、他のフィールドを使用してクラスの初期化パラメータを渡します。レジストリのチュートリアルではこれについて詳しく説明しています。

ここでは、構成フィールド ImageClassifier を例として、初期化パラメータを次のように説明します。

背骨:

バックボーンの設定。バックボーン ネットワークは、ResNet、Swin Transformer、Vision Transformer などの入力特徴を抽出するための主要なネットワークです。利用可能なすべてのバックボーン ネットワークはAPI ドキュメントに記載されています。
自己教師あり学習では、いくつかのバックボーンが再実装されています。詳細については、API ドキュメントを参照してください。

首:

ネックセッティング。ネックは、GlobalAveragePooling と同様に、バックボーンとヘッドを接続する中間モジュールです。利用可能なネックはすべて API ドキュメントに記載されています。

頭:

タスクヘッダーの設定。ヘッドは、画像分類や自己教師ありトレーニングなどの指定されたタスクを実行するタスク関連コンポーネントです。使用可能なヘッダーはすべて API ドキュメントに記載されています。

損失:

CrossEntropyLoss、LabelSmoothLoss など、最適化する損失関数。利用可能なすべての損失は、API ドキュメント PixelReconstructionLoss で確認できます。

データプリプロセッサ:

モデル前方処理用のコンポーネント。入力の前処理に使用されます。詳細については、ドキュメントを参照してください

train_cfg 画像分類子

トレーニング中の追加設定。ImageClassifier では、主に Mixup や CutMix などのバッチ拡張設定を指定するために使用します。詳細についてはドキュメントを参照してください

以下は、ResNet50 構成ファイル configs/ base /models/resnet50.pyのモデルの元の構成です

model = dict(
    type='ImageClassifier',     # The type of the main model (here is for image classification task).主要模型的类型(这里是针对图像分类任务的)。
    backbone=dict(
        type='ResNet',          # The type of the backbone module.
        # All fields except `type` come from the __init__ method of class `ResNet`
        # and you can find them from https://mmpretrain.readthedocs.io/en/latest/api/generated/mmpretrain.models.backbones.ResNet.html,#除了' type '之外的所有字段都来自' ResNet '类的__init__方法,你可以从
        depth=50,
        num_stages=4,
        out_indices=(3, ),
        frozen_stages=-1,
        style='pytorch'),
    neck=dict(type='GlobalAveragePooling'),    # The type of the neck module.
    head=dict(
        type='LinearClsHead',     # The type of the classification head module.
        # All fields except `type` come from the __init__ method of class `LinearClsHead`除了' type '之外的所有字段都来自' linearclhead '类的__init__方法
        # and you can find them from https://mmpretrain.readthedocs.io/en/latest/api/generated/mmpretrain.models.heads.LinearClsHead.html
        num_classes=1000,
        in_channels=2048,
        loss=dict(type='CrossEntropyLoss', loss_weight=1.0),
    ))
CLASSmmpretrain.models.backbones.ResNet(depth, in_channels=3, stem_channels=64, base_channels=64, expansion=None, num_stages=4, strides=(1, 2, 2, 2), dilations=(1, 1, 1, 1), out_indices=(3,), style='pytorch', deep_stem=False, avg_down=False, frozen_stages=-1, conv_cfg=None, norm_cfg={
    
    'requires_grad': True, 'type': 'BN'}, norm_eval=False, with_cp=False, zero_init_residual=True, init_cfg=[{
    
    'type': 'Kaiming', 'layer': ['Conv2d']}, {
    
    'type': 'Constant', 'val': 1, 'layer': ['_BatchNorm', 'GroupNorm']}], drop_path_rate=0.0)
CLASSmmpretrain.models.heads.LinearClsHead(num_classes, in_channels, init_cfg={
    
    'layer': 'Linear', 'std': 0.01, 'type': 'Normal'}, **kwargs)

2. データ設定

この生の構成ファイルには、データ ローダーとエバリュエーターを構築するための情報が含まれています。

データプリプロセッサ:

モデル入力前処理構成。model.data_preprocessor と同じですが、優先度が低くなります。

トレイン_評価者 | 評価者 | テスト評価者:

推定器またはメトリクスを構築するには、チュートリアルを参照してください。

トレインデータローダー | val_dataloader | テストデータローダー:

データローダーの設定

batch_size: GPUごとのバッチサイズ。
num_workers: データをフェッチする各 GPU のワーカーの数。
サンプラー:サンプラーの設定です。
persistent_workers: エポックの完了後に作業を継続するかどうか。
データセット: データセットの設定。

####### type: データセットのタイプ。私たちは CustomDataset をサポートします。ImageNet には他にも多くのデータセットがあります。ドキュメントを参照してください。

####### パイプライン: データ変換パイプライン。このチュートリアルでは、配管の設計方法を学習できます。

以下は、ResNet50 構成のデータ プリミティブ構成 configs/ base /datasets/imagenet_bs32.py です。

dataset_type = 'ImageNet',训练样本的数据类型
# preprocessing configuration
data_preprocessor = dict(
    # Input image data channels in 'RGB' order
    mean=[123.675, 116.28, 103.53],    # Input image normalized channel mean in RGB order
    std=[58.395, 57.12, 57.375],       # Input image normalized channel std in RGB order
    to_rgb=True,                       # Whether to flip the channel from BGR to RGB or RGB to BGR
)

train_pipeline = [
    dict(type='LoadImageFromFile'),     # read image
    dict(type='RandomResizedCrop', scale=224),     # Random scaling and cropping,随机缩放和裁剪
    dict(type='RandomFlip', prob=0.5, direction='horizontal'),   # random horizontal flip
    dict(type='PackInputs'),         # prepare images and labels,准备图片和标签
]

test_pipeline = [
    dict(type='LoadImageFromFile'),     # read image
    dict(type='ResizeEdge', scale=256, edge='short'),  # Scale the short side to 256,将短边缩放到256
    dict(type='CenterCrop', crop_size=224),     # center crop
    dict(type='PackInputs'),                 # prepare images and labels
]

# Construct training set dataloader
train_dataloader = dict(
    batch_size=32,                     # batchsize per GPU
    num_workers=5,                     # Number of workers to fetch data per GPU,每个GPU获取数据的工作线程数
    dataset=dict(                      # training dataset
        type=dataset_type,
        data_root='data/imagenet',
        ann_file='meta/train.txt',
        data_prefix='train',
        pipeline=train_pipeline),
    sampler=dict(type='DefaultSampler', shuffle=True),   # default sampler,默认的取样器
    persistent_workers=True,                             # Whether to keep the process, can shorten the preparation time of each epoch,是否保留流程,可以缩短每个epoch的准备时间
)

# Construct the validation set dataloader
val_dataloader = dict(
    batch_size=32,
    num_workers=5,
    dataset=dict(
        type=dataset_type,
        data_root='data/imagenet',
        ann_file='meta/val.txt',
        data_prefix='val',
        pipeline=test_pipeline),
    sampler=dict(type='DefaultSampler', shuffle=False),
    persistent_workers=True,
)
# The settings of the evaluation metrics for validation. We use the top1 and top5 accuracy here.用于验证的评估度量的设置。我们在这里使用top1和top5的精度
val_evaluator = dict(type='Accuracy', topk=(1, 5))

test_dataloader = val_dataloader  # The settings of the dataloader for the test dataset, which is the same as val_dataloader
test_evaluator = val_evaluator    # The settings of the evaluation metrics for test, which is the same as val_evaluator

3. スケジュール設定

この生の構成ファイルには主に、トレーニング戦略の設定と、トレーニング、検証、およびテストのループの設定が含まれています。

optim_wrapper: オプティマイザー ラッパーの設定。オプティマイザー ラッパーを使用して、最適化プロセスをカスタマイズします
オプティマイザー: すべての pytorch オプティマイザーをサポートします。関連する MMEngine ドキュメントを参照してください。
paramwise_cfg: パラメータのタイプまたは名前に従って異なる最適化パラメータを設定します。関連する学習戦略ドキュメントを参照してください。
accumulative_counts: バックオフを 1 回ではなく多数回行った後にパラメータを最適化します。これを使用して、小さなバッチで大規模なバッチをシミュレートできます。
param_scheduler: オプティマイザーのパラメーター戦略。

これを使用して、トレーニング中の学習率と運動量曲線を指定できます。詳細については、MMEngine のドキュメントを参照してください。

train_cfg | val_cfg | test_cfg: トレーニング、検証、テスト サイクルの設定については、関連する MMEngine ドキュメントを参照してください。

以下は、ResNet50 構成のスケジュールのプリミティブ構成 configs/ base /datasets/imagenet_bs32.py です。

optim_wrapper = dict(
    # Use SGD optimizer to optimize parameters.
    optimizer=dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001))

# The tuning strategy of the learning rate.学习率的调整策略
# The 'MultiStepLR' means to use multiple steps policy to schedule the learning rate (LR).“MultiStepLR”是指使用多步策略来调度学习率
param_scheduler = dict(
    type='MultiStepLR', by_epoch=True, milestones=[30, 60, 90], gamma=0.1)

# Training configuration, iterate 100 epochs, and perform validation after every training epoch.
# 'by_epoch=True' means to use `EpochBaseTrainLoop`, 'by_epoch=False' means to use IterBaseTrainLoop.
train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1)
# Use the default val loop settings.
val_cfg = dict()
# Use the default test loop settings.
test_cfg = dict()

# This schedule is for the total batch size 256.此计划适用于总批大小为256的批
# If you use a different total batch size, like 512 and enable auto learning rate scaling.如果您使用不同的总批大小,如512,并启用自动学习率缩放。
# We will scale up the learning rate to 2 times.我们将把学习率提高到2倍。
auto_scale_lr = dict(base_batch_size=256)

4. 実行時の設定

この部分には主に、チェックポイント戦略、ログ構成、トレーニング パラメーター、ブレークポイントの重みパス、作業ディレクトリなどの保存が含まれます。
これは、ほぼすべての構成で使用されるランタイム生の構成ファイル「configs/base/default_runtime.py」です。

# defaults to use registries in mmpretrain,默认在mmpretrain中使用注册表
default_scope = 'mmpretrain'

# configure default hooks
default_hooks = dict(
    # record the time of every iteration.,记录每次迭代的时间
    timer=dict(type='IterTimerHook'),

    # print log every 100 iterations.
    logger=dict(type='LoggerHook', interval=100),

    # enable the parameter scheduler.启用参数调度程序
    param_scheduler=dict(type='ParamSchedulerHook'),

    # save checkpoint per epoch.
    checkpoint=dict(type='CheckpointHook', interval=1),

    # set sampler seed in a distributed environment.在分布式环境中设置采样器种子
    sampler_seed=dict(type='DistSamplerSeedHook'),

    # validation results visualization, set True to enable it.
    visualization=dict(type='VisualizationHook', enable=False),
)

# configure environment
env_cfg = dict(
    # whether to enable cudnn benchmark,是否开启cudnn基准
    cudnn_benchmark=False,

    # set multi-process parameters,设置多进程参数
    mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),

    # set distributed parameters,设置分布参数
    dist_cfg=dict(backend='nccl'),
)

# set visualizer
vis_backends = [dict(type='LocalVisBackend')]  # use local HDD backend
visualizer = dict(
    type='UniversalVisualizer', vis_backends=vis_backends, name='visualizer')

# set log level
log_level = 'INFO'

# load from which checkpoint
load_from = None

# whether to resume training from the loaded checkpoint
resume = False

2. 設定ファイルの継承と変更

理解を容易にするために、寄稿者は既存の構成ファイルを継承することをお勧めします。ただし、相続権を乱用しないでください。一般に、すべての構成ファイルに対して最大継承レベル 3 を推奨します。

たとえば、構成ファイルが ResNet に基づいており、その他の変更が加えられている場合は、まず基本的な ResNet 構造、データ アンサンブル、その他のトレーニング設定を継承してから、構成ファイルを変更できます。より具体的な例として、configs/resnet/resnet50_8xb32_in1k.py のほぼすべての設定を使用したいと考えていますが、CutMixトレーニング バッチ拡張を使用し、トレーニング エポック数を 100 から 300 に変更し、学習率を減衰するタイミングを変更します。データセット パスを変更するには、次の内容を含む新しい configs/resnet/resnet50_8xb32-300e_in1k.py 構成ファイルを作成します。

# create this file under 'configs/resnet/' folder
_base_ = './resnet50_8xb32_in1k.py'

# using CutMix batch augment
model = dict(
    train_cfg=dict(
        augments=dict(type='CutMix', alpha=1.0)#增加了数据增强
    )
)

# trains more epochs
train_cfg = dict(max_epochs=300, val_interval=10)  # Train for 300 epochs, evaluate every 10 epochs
param_scheduler = dict(step=[150, 200, 250])   # The learning rate adjustment has also changed

# Use your own dataset directory
train_dataloader = dict(
    dataset=dict(data_root='mydata/imagenet/train'),
)
val_dataloader = dict(
    batch_size=64,                  # No back-propagation during validation, larger batch size can be used
    dataset=dict(data_root='mydata/imagenet/val'),
)
test_dataloader = dict(
    batch_size=64,                  # No back-propagation during test, larger batch size can be used
    dataset=dict(data_root='mydata/imagenet/val'),
)

3. コマンドの構成を変更します

スクリプト「tools/train.py」または「tools/test.py」を使用してタスクを送信したり、他のツールを使用したりする場合、パラメーター --cfg-options を指定することで、使用される構成ファイルの内容を直接変更できます。

辞書チェーンの構成キーを更新します。

構成オプションは、元の構成の辞書キーの順序で指定できます。たとえば、モデル トランク内のすべての BN ブロックをスキーマに変更します。

--cfg-options model.backbone.norm_eval=False

構成リスト内のキーを更新します。

多数の構成ディクショナリが構成内のリストを形成します。たとえば、トレーニング パイプライン data.train.pipeline は通常、リストです。パイプラインで変更するかどうかを指定できます。

[dict(type='LoadImageFromFile'), dict(type='TopDownRandomFlip', flip_prob=0.5), ...]

リスト/タプルの値を更新します。

更新する値がリストまたはタプルの場合。たとえば、通常は設定ファイルが設定されていますが、このフィールドを変更したい場合に指定できます。リスト/タプル データ型をサポートするには引用符 " が必要であり、指定された値の引用符内にスペースは使用できないことに注意してください。

val_evaluator = dict(type='Accuracy', topk=(1, 5))
--cfg-options val_evaluator.topk="(1,3)"

4. 既存モデルの推論

このチュートリアルでは、次の API の使用方法を説明します。

list_models: MMPreTrain で利用可能なモデル名のリストを表示します。
get_model: モデル名またはモデル構成からモデルを取得します。
inference_model: 対応する推論器を使用してモデルを推論します。
これはすぐに始めるためのショートカットです。高度な使用法については、すぐ下の推論を使用してください。

推論者:
ImageClassificationInferencer: 指定された画像に対して画像分類を実行します。
ImageRetrievalInferencer: 指定された画像セット上の指定された画像から画像間の検索を実行します。
ImageCaptionInferencer: 指定された画像にキャプションを生成します。
VisualQuestionAnsweringInferencer: 指定された画像に基づいて質問に答えます。
VisualGroundingInferencer: 指定された画像の説明からオブジェクトを検索します。
TextToImageRetrievalInferencer: 指定された画像セットの指定された説明に基づいて、テキストから画像への取得を実行します。
ImageToTextRetrievalInferencer: 指定された画像からの一連のテキストに対して画像からテキストへの取得を実行します。
NLVRInferencer: 指定された画像ペアとテキストに対して自然言語による視覚的推論を実行します。
FeatureExtractor: ビジュアル バックボーンを介して画像ファイルから特徴を抽出します。

利用可能なモデルをリストする

MMPreTrain 内のすべてのモデルをリストします。

from mmpretrain import list_models
list_models()

list_models は Unix ファイル名のパターン マッチングをサポートしており、*** * ** を使用して任意の文字と一致させることができます。

from mmpretrain import list_models
list_models("*convnext-b*21k")

推論器の list_models メソッドを使用して、対応するタスクに使用可能なモデルを取得できます。

from mmpretrain import ImageCaptionInferencer
ImageCaptionInferencer.list_models()

モデルを入手する

get_model を使用してモデルを取得できます。

from mmpretrain import get_model

model = get_model("convnext-base_in21k-pre_3rdparty_in1k")

model = get_model("convnext-base_in21k-pre_3rdparty_in1k", pretrained=True)

model = get_model("convnext-base_in21k-pre_3rdparty_in1k", pretrained="your_local_checkpoint_path")

model = get_model("convnext-base_in21k-pre_3rdparty_in1k", head=dict(num_classes=10))

model_headless = get_model("resnet18_8xb32_in1k", head=None, neck=None, backbone=dict(out_indices=(1, 2, 3)))
import torch
from mmpretrain import get_model
model = get_model('convnext-base_in21k-pre_3rdparty_in1k', pretrained=True)
x = torch.rand((1, 3, 224, 224))
y = model(x)
print(type(y), y.shape)

与えられたイメージについての推論

以下は、ResNet-50 の事前学習済み分類モデルによる画像の推論の例です。

from mmpretrain import inference_model
image = 'https://github.com/open-mmlab/mmpretrain/raw/main/demo/demo.JPEG'
# If you have no graphical interface, please set `show=False`
result = inference_model('resnet50_8xb32_in1k', image, show=True)
print(result['pred_class'])

inference_model API はデモンストレーションのみを目的としており、モデル インスタンスを永続化したり、複数のサンプルに対して推論を実行したりすることはできません。リーズナーを使用して複数の呼び出しを行うことができます。

from mmpretrain import ImageClassificationInferencer
image = 'https://github.com/open-mmlab/mmpretrain/raw/main/demo/demo.JPEG'
inferencer = ImageClassificationInferencer('resnet50_8xb32_in1k')
# Note that the inferencer output is a list of result even if the input is a single sample.
result = inferencer('https://github.com/open-mmlab/mmpretrain/raw/main/demo/demo.JPEG')[0]
print(result['pred_class'])
# You can also use is for multiple images.
image_list = ['demo/demo.JPEG', 'demo/bird.JPEG'] * 16
results = inferencer(image_list, batch_size=8)
print(len(results))
print(results[1]['pred_class'])

通常、各サンプルの結果は辞書になります。たとえば、画像分類結果は、pred_label、pred_score、および pred_scores を含む辞書であり、次のとおりです。

{
    
    
    "pred_label": 65,
    "pred_score": 0.6649366617202759,
    "pred_class":"sea snake",
    "pred_scores": array([..., 0.6649366617202759, ...], dtype=float32)
}

たとえば、独自の構成ファイルとチェックポイントを使用して CUDA 経由でイメージを推論するように、パラメーターを介して推論器を構成できます。

from mmpretrain import ImageClassificationInferencer
image = 'https://github.com/open-mmlab/mmpretrain/raw/main/demo/demo.JPEG'
config = 'configs/resnet/resnet50_8xb32_in1k.py'
checkpoint = 'https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth'
inferencer = ImageClassificationInferencer(model=config, pretrained=checkpoint, device='cuda')
result = inferencer(image)[0]
print(result['pred_class'])

Gradio デモによる推論

また、サポートされているすべてのタスクの Gradio デモも提供しています。これは、projects/gradio_demo/launch.py​​ にあります。
まずはgradioをインストールしてください。pip install -U gradio

pip install "gradio>=3.31.0"

ここに画像の説明を挿入

画像から特徴を抽出する

FeatureExtractor は、model.extract_feat と比較して、テンソルのバッチを使用する代わりに画像ファイルから直接特徴を抽出します。要約すると、model.extract_feat の入力は torch.Tensor であり、FeatureExtractor の入力は image です。

from mmpretrain import FeatureExtractor, get_model
model = get_model('resnet50_8xb32_in1k', backbone=dict(out_indices=(0, 1, 2, 3)))
extractor = FeatureExtractor(model)
features = extractor('https://github.com/open-mmlab/mmpretrain/raw/main/demo/demo.JPEG')[0]
features[0].shape, features[1].shape, features[2].shape, features[3].shape

5. モデルのトレーニング

このチュートリアルでは、MMPretrain で提供されるスクリプトを使用してトレーニング ジョブを開始する方法について説明します。必要に応じて、カスタム データセットを使用して事前トレーニングする方法とカスタム データセットを使用して微調整する方法に関するいくつかの実践例も提供します。

トレーニングにコンピューターを使用する

CPU とオプションの GPU を備えた単一マシン上でモデルをトレーニングする tools/train.py を使用できます。

スクリプトの完全な使用法は次のとおりです。

python tools/train.py ${CONFIG_FILE} [ARGS]

デフォルトでは、MMPretrain は CPU よりも GPU を優先します。CPU 上でモデルをトレーニングする場合は、CUDA_VISIBLE_DEVICES をクリアするか -1 に設定して、GPU がプログラムから見えないようにしてください。

CUDA_VISIBLE_DEVICES=-1 python tools/train.py ${CONFIG_FILE} [ARGS]

CONFIG_FILE 構成ファイルへのパス。

--work-dir WORK_DIR ログとチェックポイントを保存する宛先フォルダー。デフォルトは、.config の下の構成ファイルと同じ名前のフォルダー ./work_dirs です。

--resume [RESUME] トレーニングを再開します。パスが指定されている場合はそのパスから復元され、指定されていない場合は最新のチェックポイントから自動的に復元が試行されます。

--amp は、自動混合精度トレーニングを有効にします。

--no-validate 推奨されません。トレーニング中のチェックポイント評価を無効にします。

--auto-scale-lr は、実際のバッチ サイズと元のバッチ サイズに基づいて学習率を自動的にスケーリングします。

--no-pin-memory データローダーの pin_memory オプションを無効にするかどうか。

--no-persistent-workers データローダーのpersistent_workersオプションを無効にするかどうか。

–cfg-options CFG_OPTIONS 使用されている構成の一部の設定をオーバーライドします。xxx=yyy 形式のキーと値のペアが構成ファイルにマージされます。オーバーライドする値がリストの場合は、key="[a,b]" または key=a,b の形式にする必要があります。このパラメーターでは、key="[(a,b),(c,d)]" などのネストされたリスト/タプル値も許可されます。引用符は必須であり、スペースは使用できないことに注意してください。

--launcher {none,pytorch,slurm,mpi}、ジョブ ランチャーのオプション。

トレーニングに複数の GPU を使用する

マルチ GPU タスク torch.distributed.launch を起動するシェル スクリプトを提供します。

bash ./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [PY_ARGS]

環境変数を使用してランチャーの追加パラメーターを指定することもできます。たとえば、次のコマンドを使用して、イニシエータの通信ポートを 29666 に変更します。

PORT=29666 bash ./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [PY_ARGS]

複数のトレーニング ジョブを開始し、異なる GPU を使用する場合は、異なるポートと表示デバイスを指定してジョブを開始できます。

CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 bash ./tools/dist_train.sh ${CONFIG_FILE1} 4 [PY_ARGS]
CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 bash ./tools/dist_train.sh ${CONFIG_FILE2} 4 [PY_ARGS]

事前トレーニングにカスタム データセットを使用する方法

このチュートリアルでは、独自のデータセットでトレーニングする方法に関する実践例といくつかのヒントを提供します。
MMPretrain では、指定したフォルダー内の画像を直接読み取ることができる CustomDataset (torchvision の ImageFolder と同様) をサポートしています。カスタム データセットのパス情報を準備し、 config を編集するだけで済みます

ステップ 1: データセットを準備する

「データセットの準備」に従ってデータセットを準備します。データセットのルート フォルダーは、data/custom_dataset/ のようになります。
ここでは、教師なしトレーニングを実行し、サブフォルダー形式 CustomDataset を使用してデータセットを次のように編成することを想定しています。
data/custom_dataset/
§──sample1.png
§──sample2.png
§──sample3.png
§──sample4 .png
└── …

ステップ 2: 構成をテンプレートとして選択する

ここでは、この configs/mae/mae_vit-base-p16_8xb512-amp-coslr-300e_in1k.py を例として取り上げます。まず、この構成ファイルを同じフォルダーにコピーし、名前を mae_vit-base-p16_8xb512-amp-coslr-300e_custom.py に変更します。
この構成の内容は次のとおりです。

_base_ = [
    '../_base_/models/mae_vit-base-p16.py',
    '../_base_/datasets/imagenet_bs512_mae.py',
    '../_base_/default_runtime.py',
]

# optimizer wrapper
optim_wrapper = dict(
    type='AmpOptimWrapper',
    loss_scale='dynamic',
    optimizer=dict(
        type='AdamW',
        lr=1.5e-4 * 4096 / 256,
        betas=(0.9, 0.95),
        weight_decay=0.05),
    paramwise_cfg=dict(
        custom_keys={
    
    
            'ln': dict(decay_mult=0.0),
            'bias': dict(decay_mult=0.0),
            'pos_embed': dict(decay_mult=0.),
            'mask_token': dict(decay_mult=0.),
            'cls_token': dict(decay_mult=0.)
        }))

# learning rate scheduler
param_scheduler = [
    dict(
        type='LinearLR',
        start_factor=0.0001,
        by_epoch=True,
        begin=0,
        end=40,
        convert_to_iter_based=True),
    dict(
        type='CosineAnnealingLR',
        T_max=260,
        by_epoch=True,
        begin=40,
        end=300,
        convert_to_iter_based=True)
]

# runtime settings
train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=300)
default_hooks = dict(
    # only keeps the latest 3 checkpoints
    checkpoint=dict(type='CheckpointHook', interval=1, max_keep_ckpts=3))

randomness = dict(seed=0, diff_rank_seed=True)

# auto resume
resume = True

# NOTE: `auto_scale_lr` is for automatically scaling LR
# based on the actual training batch size.
auto_scale_lr = dict(base_batch_size=4096)
ステップ 3: データセット関連の構成を編集する

type データセット設定を 'CustomDataset' にオーバーライドします。
data_root データセット設定を data/custom_dataset に
オーバーライドします。サブフォルダー形式 CustomDataset を使用していると想定しているため、データセット設定 ann_file を空の文字列にオーバーライドします。
data_root の下にあるデータセット全体を使用するため、データセット オーバーライド data_prefix を空の文字列に設定し、サンプルを異なるサブセットに分割して data_prefix を設定する必要はありません。変更された構成は次のようになります

_base_ = [
    '../_base_/models/mae_vit-base-p16.py',
    '../_base_/datasets/imagenet_bs512_mae.py',
    '../_base_/default_runtime.py',
]

# >>>>>>>>>>>>>>> Override dataset settings here >>>>>>>>>>>>>>>>>>>
train_dataloader = dict(
    dataset=dict(
        type='CustomDataset',
        data_root='data/custom_dataset/',
        ann_file='',       # We assume you are using the sub-folder format without ann_file,我们假设您使用的是没有ann_file的子文件夹格式
        data_prefix='',    # The `data_root` is the data_prefix directly.
        with_label=False,
    )
)
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

# optimizer wrapper
optim_wrapper = dict(
    type='AmpOptimWrapper',
    loss_scale='dynamic',
    optimizer=dict(
        type='AdamW',
        lr=1.5e-4 * 4096 / 256,
        betas=(0.9, 0.95),
        weight_decay=0.05),
    paramwise_cfg=dict(
        custom_keys={
    
    
            'ln': dict(decay_mult=0.0),
            'bias': dict(decay_mult=0.0),
            'pos_embed': dict(decay_mult=0.),
            'mask_token': dict(decay_mult=0.),
            'cls_token': dict(decay_mult=0.)
        }))

# learning rate scheduler
param_scheduler = [
    dict(
        type='LinearLR',
        start_factor=0.0001,
        by_epoch=True,
        begin=0,
        end=40,
        convert_to_iter_based=True),
    dict(
        type='CosineAnnealingLR',
        T_max=260,
        by_epoch=True,
        begin=40,
        end=300,
        convert_to_iter_based=True)
]

# runtime settings
train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=300)
default_hooks = dict(
    # only keeps the latest 3 checkpoints
    checkpoint=dict(type='CheckpointHook', interval=1, max_keep_ckpts=3))

randomness = dict(seed=0, diff_rank_seed=True)

# auto resume
resume = True

# NOTE: `auto_scale_lr` is for automatically scaling LR
# based on the actual training batch size.
auto_scale_lr = dict(base_batch_size=4096)

編集した構成ファイルを使用すると、カスタム データセットで MAE アルゴリズムを使用して自己教師ありモデルをトレーニングできます。

上記のアイデアに従って、COCO データセットで MAE をトレーニングする方法の例も提供します。編集したファイルは次のようになります

_base_ = [
    '../_base_/models/mae_vit-base-p16.py',
    '../_base_/datasets/imagenet_mae.py',
    '../_base_/default_runtime.py',
]

# >>>>>>>>>>>>>>> Override dataset settings here >>>>>>>>>>>>>>>>>>>
train_dataloader = dict(
    dataset=dict(
        type='mmdet.CocoDataset',
        data_root='data/coco/',
        ann_file='annotations/instances_train2017.json',  # Only for loading images, and the labels won't be used.
        data_prefix=dict(img='train2017/'),
    )
)
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

# optimizer wrapper
optim_wrapper = dict(
    type='AmpOptimWrapper',
    loss_scale='dynamic',
    optimizer=dict(
        type='AdamW',
        lr=1.5e-4 * 4096 / 256,
        betas=(0.9, 0.95),
        weight_decay=0.05),
    paramwise_cfg=dict(
        custom_keys={
    
    
            'ln': dict(decay_mult=0.0),
            'bias': dict(decay_mult=0.0),
            'pos_embed': dict(decay_mult=0.),
            'mask_token': dict(decay_mult=0.),
            'cls_token': dict(decay_mult=0.)
        }))

# learning rate scheduler
param_scheduler = [
    dict(
        type='LinearLR',
        start_factor=0.0001,
        by_epoch=True,
        begin=0,
        end=40,
        convert_to_iter_based=True),
    dict(
        type='CosineAnnealingLR',
        T_max=260,
        by_epoch=True,
        begin=40,
        end=300,
        convert_to_iter_based=True)
]

# runtime settings
train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=300)
default_hooks = dict(
    # only keeps the latest 3 checkpoints
    checkpoint=dict(type='CheckpointHook', interval=1, max_keep_ckpts=3))

randomness = dict(seed=0, diff_rank_seed=True)

# auto resume
resume = True

# NOTE: `auto_scale_lr` is for automatically scaling LR
# based on the actual training batch size.
auto_scale_lr = dict(base_batch_size=4096)

事前トレーニングにカスタム データセットを使用する方法

ステップ 1: データセットを準備する

「データセットの準備」に従ってデータセットを準備します。データセットのルート フォルダーは、data/custom_dataset/ のようになります。
ここでは、教師あり画像分類トレーニングを実行し、サブフォルダー形式 CustomDataset を使用してデータセットを
data/custom_dataset/として整理すると仮定します。 ─ x_2.png │ │ §─ x_3.png │ │ └─ … │ §─ class_y │ └─ … └─ テスト├─ class_x │ │ ├─ test_x_1.png │ §─ test_x_2.png │ §── test_x_3.png │ └── … §── class_y └── …















ステップ 2: 構成をテンプレートとして選択する

ここでは、この configs/resnet/resnet50_8xb32_in1k.py を例として取り上げます。まず、この構成ファイルを同じフォルダーにコピーし、名前を resnet50_8xb32-ft_custom.py に変更します。

_base_ = [
    '../_base_/models/resnet50.py',           # model settings
    '../_base_/datasets/imagenet_bs32.py',    # data settings
    '../_base_/schedules/imagenet_bs256.py',  # schedule settings
    '../_base_/default_runtime.py',           # runtime settings
]
ステップ 3: モデル設定の編集

モデルを微調整するときは、通常、事前にトレーニングされたバックボーンの重みをロードし、新しい分類ヘッドを最初からトレーニングする必要があります。

事前トレーニングされたバックボーンをロードするには、バックボーンの初期化設定を変更し、事前トレーニングされた初期化関数を使用する必要があります。また、init_cfg では、prefix='backbone' を使用して、チェックポイントにロードする必要があるサブモジュールのプレフィックスを初期化関数に伝えます。

たとえば、ここでのバックボーンとは、バックボーン サブモジュールをロードすることを意味します。ここでは、トレーニング中に自動的にダウンロードされるオンライン チェックポイントを使用しますが、モデルを手動でダウンロードしてローカル パスを使用することもできます。次に、新しいデータセットのクラス番号に従ってヘッダーを変更する必要があります。num_classes ヘッダーを変更するだけです

新しいデータセットが小さく、事前トレーニングされたデータセットとドメインを共有する場合、バックボーンの最初の数ステージのパラメータをフリーズすると、ネットワークが事前トレーニング データセットから低レベルの情報を抽出する能力を維持できるようになります。 -訓練されたモデル。MMPretrain では、**frozen_stages パラメーターを使用して、フリーズするステージの数を簡単に指定できます。** たとえば、最初の 2 つのステージのパラメータをフリーズするには、次の設定を使用するだけです:
frozen_stages 今のところ、すべてのバックボーンがこの引数をサポートしているわけではありません。ドキュメントを参照して、バックボーンがサポートしているかどうかを確認してください。

_base_ = [
    '../_base_/models/resnet50.py',           # model settings
    '../_base_/datasets/imagenet_bs32.py',    # data settings
    '../_base_/schedules/imagenet_bs256.py',  # schedule settings
    '../_base_/default_runtime.py',           # runtime settings
]

# >>>>>>>>>>>>>>> Override model settings here >>>>>>>>>>>>>>>>>>>
model = dict(
    backbone=dict(
        frozen_stages=2,
        init_cfg=dict(
            type='Pretrained',
            checkpoint='https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth',
            prefix='backbone',
        )),
    head=dict(num_classes=10),
)
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

継承された構成がマージされ、構成全体が取得されるため、ここでは変更したい構成の一部を設定するだけで済みます。

ステップ 4: データセット設定を編集する

新しいデータセットを微調整するには、データセット タイプ、データ パイプラインなどの一部のデータセット設定をオーバーライドする必要があります。

_base_ = [
    '../_base_/models/resnet50.py',           # model settings
    '../_base_/datasets/imagenet_bs32.py',    # data settings
    '../_base_/schedules/imagenet_bs256.py',  # schedule settings
    '../_base_/default_runtime.py',           # runtime settings
]

# model settings
model = dict(
    backbone=dict(
        frozen_stages=2,
        init_cfg=dict(
            type='Pretrained',
            checkpoint='https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth',
            prefix='backbone',
        )),
    head=dict(num_classes=10),
)

# >>>>>>>>>>>>>>> Override data settings here >>>>>>>>>>>>>>>>>>>
data_root = 'data/custom_dataset'
train_dataloader = dict(
    dataset=dict(
        type='CustomDataset',
        data_root=data_root,
        ann_file='',       # We assume you are using the sub-folder format without ann_file
        data_prefix='train',
    ))
val_dataloader = dict(
    dataset=dict(
        type='CustomDataset',
        data_root=data_root,
        ann_file='',       # We assume you are using the sub-folder format without ann_file
        data_prefix='test',
    ))
test_dataloader = val_dataloader
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ステップ 5: プラン設定を編集する (オプション)

ハイパーパラメータの微調整はデフォルトのプランとは異なります。通常、より小さい学習率とより速い減衰スケジューラ エポックが必要です。

_base_ = [
    '../_base_/models/resnet50.py',           # model settings
    '../_base_/datasets/imagenet_bs32.py',    # data settings
    '../_base_/schedules/imagenet_bs256.py',  # schedule settings
    '../_base_/default_runtime.py',           # runtime settings
]

# model settings
model = dict(
    backbone=dict(
        frozen_stages=2,
        init_cfg=dict(
            type='Pretrained',
            checkpoint='https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth',
            prefix='backbone',
        )),
    head=dict(num_classes=10),
)

# data settings
data_root = 'data/custom_dataset'
train_dataloader = dict(
    dataset=dict(
        type='CustomDataset',
        data_root=data_root,
        ann_file='',       # We assume you are using the sub-folder format without ann_file
        data_prefix='train',
    ))
val_dataloader = dict(
    dataset=dict(
        type='CustomDataset',
        data_root=data_root,
        ann_file='',       # We assume you are using the sub-folder format without ann_file
        data_prefix='test',
    ))
test_dataloader = val_dataloader

# >>>>>>>>>>>>>>> Override schedule settings here >>>>>>>>>>>>>>>>>>>
# optimizer hyper-parameters
optim_wrapper = dict(
    optimizer=dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001))
# learning policy
param_scheduler = dict(
    type='MultiStepLR', by_epoch=True, milestones=[15], gamma=0.1)
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ステップ 6 トレーニングを開始する

これで、次のように構成ファイルの微調整が完了しました。

_base_ = [
    '../_base_/models/resnet50.py',           # model settings
    '../_base_/datasets/imagenet_bs32.py',    # data settings
    '../_base_/schedules/imagenet_bs256.py',  # schedule settings
    '../_base_/default_runtime.py',           # runtime settings
]

# model settings
model = dict(
    backbone=dict(
        frozen_stages=2,
        init_cfg=dict(
            type='Pretrained',
            checkpoint='https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth',
            prefix='backbone',
        )),
    head=dict(num_classes=10),
)

# data settings
data_root = 'data/custom_dataset'
train_dataloader = dict(
    dataset=dict(
        type='CustomDataset',
        data_root=data_root,
        ann_file='',       # We assume you are using the sub-folder format without ann_file
        data_prefix='train',
    ))
val_dataloader = dict(
    dataset=dict(
        type='CustomDataset',
        data_root=data_root,
        ann_file='',       # We assume you are using the sub-folder format without ann_file
        data_prefix='test',
    ))
test_dataloader = val_dataloader

# schedule settings
optim_wrapper = dict(
    optimizer=dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001))
param_scheduler = dict(
    type='MultiStepLR', by_epoch=True, milestones=[15], gamma=0.1)

ここでは、コンピューター上の 8 つの GPU を使用して、次のコマンドでモデルをトレーニングします。

bash tools/dist_train.sh configs/resnet/resnet50_8xb32-ft_custom.py 8

さらに、次のコマンドを使用して 1 つの GPU のみを使用してモデルをトレーニングできます。

python tools/train.py configs/resnet/resnet50_8xb32-ft_custom.py

ただし、待ってください。GPU を 1 つ使用する場合は、重要な構成を 1 つ変更する必要があります。次のようにデータセット構成を変更する必要があります。

data_root = 'data/custom_dataset'
train_dataloader = dict(
    batch_size=256,
    dataset=dict(
        type='CustomDataset',
        data_root=data_root,
        ann_file='',       # We assume you are using the sub-folder format without ann_file
        data_prefix='train',
    ))
val_dataloader = dict(
    dataset=dict(
        type='CustomDataset',
        data_root=data_root,
        ann_file='',       # We assume you are using the sub-folder format without ann_file
        data_prefix='test',
    ))
test_dataloader = val_dataloader

これは、トレーニング プランのバッチ サイズが 256 であるためです。8 つの GPU を使用する場合は、各 GPU の基本構成ファイルで batch_size=32 構成を使用するだけで、合計バッチ サイズは 256 になります。ただし、1 GPU を使用する場合は、トレーニング プランに合わせて手動で 256 に変更する必要があります。

ただし、バッチ サイズが大きくなると、より多くの GPU メモリが必要になります。GPU メモリを節約するための簡単なトリックをいくつか紹介します。
自動混合精度トレーニングを有効にする。

python tools/train.py configs/resnet/resnet50_8xb32-ft_custom.py --amp

より小さいバッチ サイズ (例: 256 ではなく batch_size=32) を使用し、自動学習率スケーリングを有効にします。

python tools/train.py configs/resnet/resnet50_8xb32-ft_custom.py --auto-scale-lr

auto_scale_lr.base_batch_size 自動学習率スケーリングは、実際のバッチ サイズに基づいて学習率を調整します(これは、base config configs/ base /schedules/imagenet_bs256.pyにあります)。

6. モデルのテスト

画像分類タスクと画像検索タスクの場合、トレーニング後にモデルをテストできます。

コンピュータを使用してテストする

tools/test.py を使用すると、CPU とオプションの GPU を備えた 1 台のコンピューターでモデルをテストできます。
スクリプトの完全な使用法は次のとおりです。

python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [ARGS]

デフォルトでは、MMPretrain は CPU よりも GPU を優先します。CPU 上でモデルをテストしたい場合は、CUDA_VISIBLE_DEVICES をクリアするか -1 に設定して、GPU がプログラムから見えないようにしてください。

CUDA_VISIBLE_DEVICES=-1 python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [ARGS]

CONFIG_FILE 構成ファイルへのパス。

CHECKPOINT_FILE チェックポイント ファイルへのパス (http リンクにすることもできます。チェックポイントはここで見つけることができます)。
--work-dir WORK_DIR 評価メトリックを含むファイルを保存するディレクトリ。
--out OUT テスト結果を含むファイルを保存するパス。
--out-item OUT_ITEM テスト結果ファイルの内容 (「pred」または「metrics」) を指定します。「pred」の場合、オフライン評価用にモデルの出力を保存します。「メトリクス」の場合、評価メトリクスを保存します。デフォルトは「pred」です。
–cfg-options CFG_OPTIONS 使用されている構成の一部の設定をオーバーライドします。xxx=yyy 形式のキーと値のペアが構成ファイルにマージされます。オーバーライドする値がリストの場合は、key="[a,b]" または key=a,b の形式にする必要があります。このパラメーターでは、key="[(a,b),(c,d)]" などのネストされたリスト/タプル値も許可されます。引用符は必須であり、スペースは使用できないことに注意してください。

--show-dir SHOW_DIR 結果の視覚化画像を保存するディレクトリ。
--show は、予測結果をウィンドウに視覚化します。

--interval INTERVAL 視覚化するサンプル間隔。

--wait-time WAIT_TIME 各ウィンドウの表示時間を秒単位で指定します。デフォルトは 1 です。
--no-pin-memory データローダーの pin_memory オプションを無効にするかどうか。

-tta (TTA) を有効にするかどうか。構成ファイルに tta_pipeline フィールドと tta_model フィールドがある場合は、それらを使用して TTA 変換と TTA 結果の結合方法を決定します。それ以外の場合は、分類スコアを平均することによって反転 TTA が使用されます。
--launcher {none,pytorch,slurm,mpi}、ジョブ ランチャーのオプション。

複数の GPU でテストする

bash ./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [PY_ARGS]

7. 下流タスク

検出

検出タスクには、MMDetection を使用します。まず、OpenMMLab のプロジェクトでもある MIM がインストールされていることを確認してください。

pip install openmim
mim install 'mmdet>=3.0.0rc0'

インストールすると
、簡単なコマンドで MMDetection を実行できます。

# distributed version
bash tools/benchmarks/mmdetection/mim_dist_train_c4.sh ${CONFIG} ${PRETRAIN} ${GPUS}
bash tools/benchmarks/mmdetection/mim_dist_train_fpn.sh ${CONFIG} ${PRETRAIN} ${GPUS}

# slurm version
bash tools/benchmarks/mmdetection/mim_slurm_train_c4.sh ${PARTITION} ${CONFIG} ${PRETRAIN}
bash tools/benchmarks/mmdetection/mim_slurm_train_fpn.sh ${PARTITION} ${CONFIG} ${PRETRAIN}

${CONFIG}: MMDetection で構成ファイルのパスを直接使用します。一部のアルゴリズムについては、変更された構成ファイルもいくつかあります。これらは、対応するアルゴリズム フォルダーの下のベンチマーク フォルダーにあります。構成ファイルを最初から作成することもできます。
${PRETRAIN}: 事前トレーニングされたモデル ファイル。
${GPUS}: トレーニングに使用する GPU の数。デフォルトでは 8 つの GPU を使用して検出タスクを実行します。

bash ./tools/benchmarks/mmdetection/mim_dist_train_c4.sh \
  configs/byol/benchmarks/mask-rcnn_r50-c4_ms-1x_coco.py \
  https://download.openmmlab.com/mmselfsup/1.x/byol/byol_resnet50_16xb256-coslr-200e_in1k/byol_resnet50_16xb256-coslr-200e_in1k_20220825-de817331.pth 8

トレーニング後
、次のコマンドを実行してモデルをテストすることもできます。

# distributed version
bash tools/benchmarks/mmdetection/mim_dist_test.sh ${CONFIG} ${CHECKPOINT} ${GPUS}

# slurm version
bash tools/benchmarks/mmdetection/mim_slurm_test.sh ${PARTITION} ${CONFIG} ${CHECKPOINT}

${CONFIG}: MMDetection で構成ファイル名を直接使用します。一部のアルゴリズムについては、変更された構成ファイルもいくつかあります。これらは、対応するアルゴリズム フォルダーの下のベンチマーク フォルダーにあります。構成ファイルを最初から作成することもできます。

${CHECKPOINT}: テストする微調整された検出モデル。

${GPUS}: テストに使用する GPU の数。デフォルトでは 8 つの GPU を使用して検出タスクを実行します。

bash ./tools/benchmarks/mmdetection/mim_dist_test.sh \
configs/byol/benchmarks/mask-rcnn_r50_fpn_ms-1x_coco.py \
https://download.openmmlab.com/mmselfsup/1.x/byol/byol_resnet50_16xb256-coslr-200e_in1k/byol_resnet50_16xb256-coslr-200e_in1k_20220825-de817331.pth 8

分割

セマンティック セグメンテーション タスクには、MMSegmentation を使用します。まず、OpenMMLab のプロジェクトでもある MIM がインストールされていることを確認してください。

pip install openmim
mim install 'mmsegmentation>=1.0.0rc0'

モデル トレーニング
がインストールされたら、簡単なコマンドで MMSegmentation を実行できます。

# distributed version
bash tools/benchmarks/mmsegmentation/mim_dist_train.sh ${CONFIG} ${PRETRAIN} ${GPUS}

# slurm version
bash tools/benchmarks/mmsegmentation/mim_slurm_train.sh ${PARTITION} ${CONFIG} ${PRETRAIN}

${CONFIG}: MMSegmentation で構成ファイルのパスを直接使用します。一部のアルゴリズムについては、変更された構成ファイルもいくつかあります。これらは、対応するアルゴリズム フォルダーの下のベンチマーク フォルダーにあります。構成ファイルを最初から作成することもできます。
${PRETRAIN}: 事前トレーニングされたモデル ファイル。
${GPUS}: トレーニングに使用する GPU の数。セグメンテーション タスクにはデフォルトで 4 GPU を使用します。

bash ./tools/benchmarks/mmsegmentation/mim_dist_train.sh \
configs/benchmarks/mmsegmentation/voc12aug/fcn_r50-d8_4xb4-20k_voc12aug-512x512.py \
https://download.openmmlab.com/mmselfsup/1.x/byol/byol_resnet50_16xb256-coslr-200e_in1k/byol_resnet50_16xb256-coslr-200e_in1k_20220825-de817331.pth 4

モデルのテスト
トレーニング後に、次のコマンドを実行してモデルをテストすることもできます。

# distributed version
bash tools/benchmarks/mmsegmentation/mim_dist_test.sh ${CONFIG} ${CHECKPOINT} ${GPUS}

# slurm version
bash tools/benchmarks/mmsegmentation/mim_slurm_test.sh ${PARTITION} ${CONFIG} ${CHECKPOINT}

${CONFIG}: MMSegmentation で構成ファイル名を直接使用します。一部のアルゴリズムについては、変更された構成ファイルもいくつかあります。これらは、対応するアルゴリズム フォルダーの下のベンチマーク フォルダーにあります。構成ファイルを最初から作成することもできます。

${CHECKPOINT}: テストする微調整されたセグメンテーション モデル。

${GPUS}: テストに使用する GPU の数。セグメンテーション タスクにはデフォルトで 4 GPU を使用します。

bash ./tools/benchmarks/mmsegmentation/mim_dist_test.sh  fcn_r50-d8_4xb4-20k_voc12aug-512x512.py \
https://download.openmmlab.com/mmselfsup/1.x/byol/byol_resnet50_16xb256-coslr-200e_in1k/byol_resnet50_16xb256-coslr-200e_in1k_20220825-de817331.pth 4

おすすめ

転載: blog.csdn.net/qq_41627642/article/details/131561433
おすすめ