For AI agents: the complete documentation index is available at https://docs.dataplatform.ovh.net/ja/llms.txt, the full documentation bundle is available at https://docs.dataplatform.ovh.net/ja/llms-full.txt, and this page is available as Markdown at https://docs.dataplatform.ovh.net/ja/legacy/ml-pipelines-configure-training-custom-pytorch.md.
  • 🇯🇵 日本語
  • カスタム PyTorch スクリプトをインポートする

    Warning

    このページでは、Machine Learning Managerについて説明します。これは、ForePaaS レガシー プラットフォームのサービスで、OVHcloud Data Platformでは利用できません。現在のドキュメントを参照してください。

    PyTorch フレームワークを使用すると、PyTorch モデルと互換性のある Python の .py ファイルをアップロードできます。

    このフレームワークを選択すると、パイプラインの環境にデフォルトで以下のパッケージがインポートされます:

    カスタム スクリプトで使用するその他のライブラリは、Dependencies パネルPython ライブラリ フィールドに指定する必要があります(最新バージョンを使用しない場合はバージョンも指定します)。

    machinelearning

    💡 requirements.txt ファイルを読み込んで、必要なライブラリを一括で追加することができます。

    デフォルトでは、新しいパイプラインは Python 3.9.9 を使用します。

    カスタム モデルをアップロードする

    カスタム モデルをアップロードするには、トレーニング スクリプト ボックスに .py ファイルをドラッグするか、ボックスをクリックしてファイル エクスプローラーを開きます。

    machinelearning

    トレーニング ジョブが実行されると、この .py ファイルが実行されます。このファイルには、以下の 2 つの要件を満たす関数を含める必要があります:

    • 最初の引数に event があること
    • トレーニング データセットに基づいてフィットされた PyTorch モデルを返すこと

    この関数の名前は、function name ボックスに記入する必要があります。

    machinelearning

    さらに、ForePaaS PyTorch フレームワークに固有のものとして、PyTorch モデルとデータセットのベース クラスをスクリプトに含める必要があり、他の関数やクラス内にネストできません:

    • torch.utils.data.Dataset
    • nn.Module

    子クラスの名前には制限があります。唯一の制約は、親クラスが前述のものであることです。両方を含める必要があります。失敗を避けるために。

    最後に、入力層の想定される次元は、実行する関数の名前とともに概要ページに提供する必要があります:

    machinelearning

    以下は、Getting Started チュートリアル データセットで使用されるカスタム PyTorch モデルのサンプル コードです。コードの構造に注意してください:

    import numpy as np
    import pandas as pd
    import torch
    import torch.nn as nn
    import torch.nn.functional as F
    from torch.utils.data import Dataset, DataLoader
    
    from logging import getLogger
    
    logger = getLogger(__name__)
    
    
    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    
    batch_size = 64
    epochs = 5
    
    # define structured dataset class
    class TabularDataset(Dataset):
      def __init__(self, data, input_cols=None, output_col=None):
        self.n = data.shape[0]
        if output_col:
          self.y = data[output_col].astype(np.float32).values.reshape(-1, 1)
        else:
          self.y =  np.zeros((self.n, 1))
        if input_cols:
            self.x = data[input_cols].astype(np.float32).values
        else:
            input_cols = [col for col in data.columns if col != output_col]
            self.x = data[input_cols].astype(np.float32).values
    
      def __len__(self):
        return self.n
    
      def __getitem__(self, idx):
        return [self.y[idx], self.x[idx]]
    
    # define model class
    class Model(nn.Module):
        def __init__(self, in_features=13, h1=32, h2=8, out_features=1):
            # how many layers?
            super().__init__()
            self.fc1 = nn.Linear(in_features, h1)
            self.fc2 = nn.Linear(h1, h2)
            self.out = nn.Linear(h2, out_features)
        
        def forward(self, x):
            x = F.relu(self.fc1(x))
            x = F.relu(self.fc2(x))
            x = self.out(x)
            return x
    
    
    def pytorch_model_train(event):
        # forepaas get data
        x_df, y_df = get_train_dataset()
        
        data = pd.concat([x_df,y_df], axis=1)
        output_feature = "is_overcrowded"
        # get data
        train_data = TabularDataset(data=data,input_cols=None,output_col=output_feature)
        train_loader = DataLoader(dataset = train_data, batch_size=batch_size, shuffle=True )
        logger.info(len(train_data))
    
        model = Model().to(device)
        model.train()
    
        # some additional params
        criterion = nn.BCEWithLogitsLoss()
        optimizer = torch.optim.Adam(model.parameters(), lr=0.1)
    
        for epoch in range(epochs):
            epoch_loss = 0
            epoch_accuracy = 0 
            for y, x in train_loader:
                x = x.to(device)
                y  = y.to(device)
                # Forward Pass
                preds = model(x)
                loss = criterion(preds, y)
                # Backward Pass and Optimization
                optimizer.zero_grad()
                loss.backward()
                optimizer.step()
                
                acc = ((preds.argmax(dim=1) == y).float().mean())
                epoch_accuracy += acc/len(train_loader)
                epoch_loss += loss/len(train_loader)
            logger.info('Epoch : {}, train accuracy : {}, train loss : {}'.format(epoch+1, epoch_accuracy,epoch_loss))
    
        return model

    上記のコードを使用する場合、pytorch_model_trainfunction name として、13,1input_shape として指定する必要があります。

    前のコードでは、トレーニングとチューニングのステップで行った設定のいずれも使用できませんが、ForePaaS SDKを使用して、モデルからパイプライン設定の他の部分に接続できます。これにより、カスタム エスティメーターで ForePaaS パイプラインが提供するすべての機能を使用できます。

    以下の設定を統合できます:

    !> トレーニング ジョブ中にカスタム .py スクリプトのみが実行されるため、Python スクリプトに前述の設定を統合しなかった場合、パイプラインはインターフェースからの変更を無視します。


    非構造化データのトレーニングに PyTorch を使用する

    Machine Learning Manager は、PyTorch モデルのトレーニングと予測で画像分類をサポートします。

    データ準備

    非構造化データのトレーニングを有効にするには、まず画像を 各クラスの名前が付いたフォルダー にアップロードする必要があります。

    非構造化データの準備方法を学ぶ

    トレーニング

    トレーニング中、SDK メソッド get_train_datasetget_test_dataset構造化データと異なる動作をします。これらは、トレーニング画像へのパスと関連付けられたラベル(.txt ファイルとして)を含む 2 つの 1 列の DataFrame を返します。画像とラベルの列名はそれぞれ inputoutput です。

    Warning

    ラベルは、バケット内の順序に基づいて整数として返されます。これは通常、アルファベット順です。

    そのため、PyTorch データセット クラス内で画像とラベルを読み込み、処理する必要があります。以下のサンプル コードに示すように。

    train_transforms =  transforms.Compose([
            transforms.Resize(150),
            transforms.RandomResizedCrop(150),
            transforms.ToTensor(),
        ])
    
    class dataset(torch.utils.data.Dataset):
        def __init__(self,image_list,label_list,transform=None):
            self.file_list_df = image_list
            self.label_list_df = label_list
            self.transform = transform
            
        def __len__(self):
            self.filelength = len(self.file_list_df)
            return self.filelength
        
        def __getitem__(self,idx):
            file_list = self.file_list_df["input"].values.tolist()
            img_path = file_list[idx]
            img = Image.open(img_path)
            resized_img = img.resize((vertical_px, horizontal_px))
            img = resized_img.convert(mode='L')
            image_2_npArray_2_tensor = transforms.ToTensor()(img)
            label_list = self.label_list_df["output"].values.tolist()
            with open(label_list[idx],'r') as file:
                label = int(file.read())
            return image_2_npArray_2_tensor,torch.tensor(label)
    
    ...
    
    
    def pytorch_train(event):
        # forepaas get data
        x_df, y_df = get_train_dataset()
        train_feature,val_feature,train_label,val_label= train_test_split(x_df, y_df, test_size=0.2)
    
        # get data
        train_data = dataset(train_feature,train_label)
        val_data = dataset(val_feature,val_label, transform=test_transforms)
        ...
      
    Warning

    非構造化データ モデルが予測に使用される場合、実際の非構造化オブジェクト(画像など)を入力する必要があります。プラットフォームは自動的にそれらを「NumPy 化」し、標準化/正規化を適用します。そのため、ニューラル ネットワーク スクリプトの入力層に入るデータも正規化する必要があります

    その後、event をメソッドの唯一の引数として、PyTorch モデルの残りの部分を追加できます:

    💡 カスタム .py に複数のメソッドを含めることができます。UI の function name フィールドで指定したメソッドのみが実行されます。

    ForePaaS パイプラインで GPU を使用してニューラル ネットワークのトレーニングを加速 できます。詳細については、以下のリンクを参照してください。

    ML 処理に GPU を使用する