English Deutsch
preview
独自のLLMをEAに統合する(第3部):CPUを使った独自のLLMの訓練

独自のLLMをEAに統合する(第3部):CPUを使った独自のLLMの訓練

MetaTrader 5 | 22 7月 2024, 10:37
14 0
Yuqiang Pan
Yuqiang Pan

はじめに

親愛なる友人の皆さん、お久しぶりです。

このタイトルを見て少し驚かれたかもしれませんが、読んで字のごとくです。

本連載の前回の記事では、大規模言語モデルを実行するための基本的な環境設定について説明し、WSLでllama.cppを使ってシンプルなLLMインスタンスを実行しました。最もエキサイティングなのは、強力なGPUがなくても、純粋にCPUだけで例を実行できることです。この一連のチュートリアルでは、ハードウェアの必要条件をできる限り下げ、読者がハードウェアの問題に邪魔されることなく、サンプルを試したり検証したりできるように努めています。もちろん、モデル訓練の部分では、純粋なCPUバージョンや、AMDグラフィックカードのアクセラレーションコンピューティングをサポートするバージョンなど、さまざまなハードウェアプラットフォーム用のブランチも紹介する予定です。

もちろん、CPUで学習させたモデルは役に立つのか、このようなモデルの意義は何なのかなどの疑問をお持ちかもしれません。確かに、複雑な関数を持つモデルを学習させたり、CPUを使って複雑なタスクを解決しようと思えば、これはかなり難しいですが、それでも、ある特定の比較的単純な関数を実装するために使用することは可能です。

この記事では、CPUを使った大規模言語モデルの学習方法と、大規模言語モデルの学習に必要な金融データセットの作成方法について説明します。私の他の記事で述べた知識が関係してくるかもしれませんが、ここでは繰り返しません。より深く知りたい場合は、私の関連記事をご覧ください。

目次


大規模言語モデルデータセットについて

現段階では、ほとんどすべての大規模言語モデルがTransformerをベースにしていることが分かっています。この記事ではTransformerの原理について掘り下げることはしません。興味のある読者は理解のために公式ドキュメントをご参照ください。関連するデータセットを処理するためのメソッドが、Transformersやtiktokenのようないくつかの成熟したライブラリに統合されており、これらのデータ処理モデルをTransformersライブラリやtiktokenライブラリで便利に見つけることができることを知っていれば大丈夫です。


1.トークナイザ

トークナイザセグメンテーションアルゴリズムは、自然言語処理言語モデルの最も基本的な構成要素です。トークナイザに基づき、テキストを独立したトークンのリストに変換し、それをコンピュータが理解できる入力ベクトルに変換することができます。トークナイザでは、テキストの正規化、セグメンテーションの前処理、セグメンテーションモデルに基づくセグメンテーション、後処理などのために、事前に訓練されたモデルを使用します。前述したように、トークナイザは、さまざまな事前学習済みモデル(GPT、GPT-2、GPT-J、GPT-Neo、RoBERTa、BART、LLaMA、AlBERT、T5、mBART、XLNetなど)も統合しており、データを処理するためにさまざまな事前学習済みモデルを選択することができます(もちろん、独自のセグメンテーションモデルを学習することもできます)。

2.トークナイザによって用途や目的は異なる

  • エンコーダのモデル:主なモデルには、ALBERT、BERT、DistilBERT、ELECTRA、RoBERTaがあり、文の分類、名前付きエンティティ認識(より一般的には単語の分類)、抽出的質問応答など、完全な文を理解する必要があるタスクに適しています。
  • デコーダーのモデル:主なモデルは「CTRL」「GPT」「GPT-2」「TransformerXL」など。デコーダーモデルの事前学習は、通常、文中の次の単語を予測することを中心に展開されます。これらのモデルは、テキスト生成を含むタスクに最適です。
  • エンコーダーデコーダーのモデル:主なモデルは「BART」、「T5」、「Marian」、「mBART」など。これらのモデルは、要約、翻訳、生成的質問応答など、与えられた入力に基づいて新しい文章を生成するタスクに最も適しています。
3. スペシャルトークン
モデルがシーケンスの開始と終了を認識できるようにするために、通常、セグメンテーションにトークナイザを使用する場合は、[CLS]、[SEP]などの特別な記号を追加します。この記事では、シーケンスのターミネーターとして['<|endoftext|>']を使用します。


データセットの作成

独自のモデルを訓練する場合、データセットの作成が最大の課題となることがよくあります。というのも、既存のデータセットを使ってモデルを訓練する方法についてのチュートリアルはたくさんありますが、独自のデータセットを作成する方法について説明しているものはほとんどないからです。そのため、モデルの訓練は簡単にできても、自分のアイデアに基づいてデータセットを作成する方法がわからないかもしれません。この部分については、私の連載「時系列マイニングのためのデータラベル」(「時系列マイニングのためのデータラベル(第1回):EA操作チャートでトレンドマーカー付きデータセットを作成する」を含む全6回)を参考にしていただければと思います。もちろん、この知識を大規模言語モデルの訓練に応用することもできます。

さて、本題に戻りましょう。現在もMetaTrader 5クライアントからデータを取得し、データを処理しています。CPUで実行することを考慮し、これまでのほとんどのPCの性能を考慮して、シーケンス長をあまり大きくしないように定義します。そうでなければ、動作が遅すぎてテスト体験が悪くなります。 この記事の例は、CPUを使った訓練方法のデモンストレーションを目的としています。データセットの作成とモデルの訓練はあくまで例であり、理想的な結果が得られない可能性があることにご注意ください。より良い結果を得たいのであれば、より大きなデータセットや、期待されるタスクにより適したデータセットを用意し、追加のデータ処理を行う必要があるかもしれません。また、それに応じてモデルのパラメータを調整する必要があるかもしれませんが、これらのトピックはこの基本的な例では取り上げません。
いよいよデータセットの作成に取りかかります。

1.グローバル変数の定義

主にファイルパスの定義に使われます。

DATA_DIR = os.path.dirname(__file__)
data_file = os.path.join(DATA_DIR, "llm_data.csv")


2.クライアントからのデータ取得

CPUでの学習には限界があるため、初期データとして2500データポイントの単一通貨ペアのデータを取得します。

    mt_data_len=2500
    sr_len=60

    if not mt.initialize():
        print("mt initialize failed!")
    else:
        sbs=mt.symbols_get(group='*micro*')
        if sbs is  not  None:
            # for i in [mt.TIMEFRAME_M5,mt.TIMEFRAME_M15,mt.TIMEFRAME_H1,mt.TIMEFRAME_D1]:

私の口座はmicro口座なので、「group='*micro*」を使用して「micro」のついた通貨ペアを探すために、関数「mt.symbols_get(group='*micro*')」を使ってクライアントの通貨ペアを取得しました。スタンダード口座を使用している場合、この条件を削除する必要があります。そうしないと、通貨ペアを見つけることができません。もちろん、「micro」を変更して、興味のある通貨ペアにマッチさせることもできます。例えば、GBPを使って、英ポンドを含むすべての通貨ペアにマッチさせることができます。


3. データの分割
CPUの計算能力を考慮し、クオートから close列のみを取り出し、インデックス0から開始し、60クオートごとにシーケンスとし、長さが60未満のシーケンスは破棄します。こうすることで、単純に各60クオートの長さのシーケンスのコレクションを作成したことになります。もちろん、個人のCPUの計算能力に応じて長さを変えることもできます。原理的には、シーケンスが長ければ長いほど、潜在的な効果は高くなります。コードでは、期間とバラエティの選択を制御するために2つのforループを使用しました。これにより、簡単に期間を増やしたり、通貨ペアを増やしたりすることができ、データセットは必要に応じていつでも調整することができます。


            for i in [mt.TIMEFRAME_M5,]: 
                xy=None
                # xy_list=[]
                ct=0
                for j in sbs: 
                    if ct>0:
                        break 
                    print(j.name)
                    d_=mt.copy_rates_from_pos(j.name,i,0,mt_data_len)
                    df_d=pd.DataFrame(d_)
                    cl_d=df_d['close']
                    k=0
                    while k+1:
                        if mt_data_len-k>=sr_len:
                            cl_ds=cl_d[k:k+sr_len].tolist()
                            if xy is None:
                                xy=pd.DataFrame([cl_ds])
                                # xy_list=[cl_ds]
                            else:
                                xy.loc[len(xy)]=cl_ds
                                # xy_list.append(cl_ds)
                            k+=1                       
                        else:
                            break
                    ct+=1
            mt.shutdown()

  • 変数ctを使って、いくつの通貨ペアのデータを取得するかをコントロールします。
  • kは、シーケンスデータを得るためのデータインデックスオフセットを制御するために使用されます。データ配列の長さが変数sr_lenで定義された長さより短い場合、データセットxyへの配列の追加を停止します。


4.処理したデータをファイルに書き込む

もちろん、これはオプションのステップであり、ファイルを保存せずにデータ処理を進めることもできます。しかし、このデータは今後も使い続けるだろうし、何度も取得する必要はないので、やはり保存しておくことをお勧めします。

xy.to_csv(data_file)
この時点で、データセットは完成しました。この部分を関数にカプセル化し、簡単に呼び出せるようにします。
def get_data():
    mt_data_len=2500
    sr_len=60

    if not mt.initialize():
        print("mt initialize failed!")
    else:
        sbs=mt.symbols_get(group='*micro*')
        if sbs is  not  None:
            # for i in [mt.TIMEFRAME_M5,mt.TIMEFRAME_M15,mt.TIMEFRAME_H1,mt.TIMEFRAME_D1]:
            for i in [mt.TIMEFRAME_M5,]: 
                xy=None
                # xy_list=[]
                ct=0
                for j in sbs: 
                    if ct>0:
                        break 
                    print(j.name)
                    d_=mt.copy_rates_from_pos(j.name,i,0,mt_data_len)
                    df_d=pd.DataFrame(d_)
                    cl_d=df_d['close']
                    k=0
                    while k+1:
                        if mt_data_len-k>=sr_len:
                            cl_ds=cl_d[k:k+sr_len].tolist()
                            if xy is None:
                                xy=pd.DataFrame([cl_ds])
                                # xy_list=[cl_ds]
                            else:
                                xy.loc[len(xy)]=cl_ds
                                # xy_list.append(cl_ds)
                            k+=1                       
                        else:
                            break
                    ct+=1
            mt.shutdown()
            
    # print(len(xy),"   ",len(xy_list))
    xy.to_csv(data_file)
    # xy.to_json(f'llm_data.json')
    return xy
前述したように、この記事のデータセットの作成はほんの一例です。自分のアイデアで内部のパラメータを完全に変更してテストすることができます。


データ処理

トークナイザについてはすでに述べたとおりですが、データセットを手に入れた次のステップは、トークナイザを使ってデータを処理することです。この例では、tiktokenライブラリを使用し、データセットをエンコードするために事前に訓練されたモデル「gpt2」を選択します。

1.データを読む

作成したデータを取得するには、2つのメソッドがあります。1つは保存したファイルを読み込むメソッド、もう1つはget_data()関数の戻り値を直接使用するメソッドです。

注意すべき点は、保存したファイルを読み込む場合は、保存と読み込みの過程で追加された余分な最初の行と列を削除する必要があるが、関数の戻り値を使用する場合はその必要がないことです。
data=get_data()
# data=pd.read_csv(data_file)
# data=data.iloc[1:,1:]
デフォルトでは、関数の戻り値を使用してデータを取得します。

2.変数の定義

ここでは、トークナイザをインスタンス化し、特別なトークンを定義する必要があります。前述したように、この記事では「<|endoftext|>」をシーケンスの開始と終了として使用しています。
    enc = tiktoken.get_encoding("gpt2")
    encode = lambda s: enc.encode_ordinary(s)
    eot = enc._special_tokens['<|endoftext|>']

    train_tokens=[]
    val_tokens=[]
    val_cut=len(data)//10

val_cutは、訓練データセットと検証データセットを分割するために使用されます。訓練セットとバリデーションセットの比率を変更したい場合は、「10」を適切と思われる値に変更してください。この例では、データ全長の10%を検証セットとして使用します。


3. Binファイルへの書き込み関数の定義

最終的なデータ処理の前に、処理したデータをbinファイルに書き出す関数を定義する必要があります。

def data_to_file(path, tks):

    header = np.zeros(256, dtype=np.int32)
    header[0] = 20240520
    header[1] = 1
    header[2] = len(tks)
    toks_np = np.array(tks, dtype=np.uint16)
    with open(path, "wb") as f:
        f.write(header.tobytes())
        f.write(toks_np.tobytes())

この関数自体は難しくありませんが、header[0]=20240520という値に注意することが重要です。これは、大規模モデルのその後の訓練に使用される可能性があります。大規模なモデルを訓練するためのデータの読み込み中に、この値が確認され、一致しない場合はエラーが発生します。これは特に注意が必要です。



4.データのトークン化


まず、forループを使ってデータセットの各行を走査し、各シーケンスを取得します。変数iにはシーケンスの行番号を、rにはシーケンスを格納します。

for i,r in data.iterrows():
この時点で、rはデータをSeries形式で保存します。まずリスト形式に変換し、次にリスト形式を「x,x,x,x,..」.というスタイルの文字列列に変換する必要があります。もちろん、f'{ser}'を直接使って、文字列を折り返しリスト形式の「[x,x,x,x,x,]」に変換することもできますが、それはちょっと変なので、「x,x,x,x,x,x,」のスタイルにこだわりましょう。
ser=r.tolist()
ser= ''.join(str(elem) for elem in ser)

次に、データセットの最初の10%をval_tokensに、残りの10%をtrain_tokensに格納してシーケンスをエンコードし、data_to_file()関数を呼び出してそれぞれのbinファイルに書き込みます。

tokens = encode(ser)
if i< val_cut:
    val_tokens.append(eot)
    val_tokens.extend(tokens)
    enc_f = os.path.join(DATA_DIR, "val_data.bin")
    data_to_file(enc_f, val_tokens)
else:
    train_tokens.append(eot)
    train_tokens.extend(tokens)
    enc_f = os.path.join(DATA_DIR, "train_data.bin")
    data_to_file(enc_f, train_tokens)
これでデータのトークン化は完了しました。データの取得からトークン化までの全プロセスを終了し、この内容をdata_enc.pyというファイルに書き込みます。以下は、ファイル全体の完全なコードです。
import MetaTrader5 as mt
import pandas as pd
import numpy as np
import os
import tiktoken


DATA_DIR = os.path.dirname(__file__)
data_file = os.path.join(DATA_DIR, "llm_data.csv")

def get_data():
    mt_data_len=2500
    sr_len=60

    if not mt.initialize():
        print("mt initialize failed!")
    else:
        sbs=mt.symbols_get(group='*micro*')
        if sbs is  not  None:
            # for i in [mt.TIMEFRAME_M5,mt.TIMEFRAME_M15,mt.TIMEFRAME_H1,mt.TIMEFRAME_D1]:
            for i in [mt.TIMEFRAME_M5,]: 
                xy=None
                # xy_list=[]
                ct=0
                for j in sbs: 
                    if ct>0:
                        break 
                    print(j.name)
                    d_=mt.copy_rates_from_pos(j.name,i,0,mt_data_len)
                    df_d=pd.DataFrame(d_)
                    cl_d=df_d['close']
                    k=0
                    while k+1:
                        if mt_data_len-k>=sr_len:
                            cl_ds=cl_d[k:k+sr_len].tolist()
                            if xy is None:
                                xy=pd.DataFrame([cl_ds])
                                # xy_list=[cl_ds]
                            else:
                                xy.loc[len(xy)]=cl_ds
                                # xy_list.append(cl_ds)
                            k+=1                       
                        else:
                            break
                    ct+=1
            mt.shutdown()
            
    # print(len(xy),"   ",len(xy_list))
    xy.to_csv(data_file)
    # xy.to_json(f'llm_data.json')
    return xy

def data_to_file(path, tks):

    header = np.zeros(256, dtype=np.int32)
    header[0] = 20240520 
    header[1] = 1 
    header[2] = len(tks) 
    toks_np = np.array(tks, dtype=np.uint16)
    with open(path, "wb") as f:
        f.write(header.tobytes())
        f.write(toks_np.tobytes())

if __name__=="__main__":

    data=get_data()
    # data=pd.read_csv(data_file)
    # data=data.iloc[1:,1:]

    enc = tiktoken.get_encoding("gpt2")
    encode = lambda s: enc.encode_ordinary(s)
    eot = enc._special_tokens['<|endoftext|>']

    train_tokens=[]
    val_tokens=[]
    val_cut=len(data)//10
    for i,r in data.iterrows():
        ser=r.tolist()
        ser=''.join(str(elem) for elem in ser)
        # ser = ser.strip() 
        tokens = encode(ser)
        if i< val_cut:
            val_tokens.append(eot)
            val_tokens.extend(tokens)
            enc_f = os.path.join(DATA_DIR, "val_data.bin")
            data_to_file(enc_f, val_tokens)
        else:
            train_tokens.append(eot)
            train_tokens.extend(tokens)
            enc_f = os.path.join(DATA_DIR, "train_data.bin")
            data_to_file(enc_f, train_tokens)
    print(f"tain:{len(train_tokens)}",f"val:{len(val_tokens)}")

次に、大規模モデルを訓練します。始めましょう。
  • トークン化のために初めてtiktokenライブラリを使用すると、対応する事前学習済みモデルをhuggingfaceからダウンロードするためにインターネットに接続するので、ネットワークがhuggingfaceにアクセスできることを確認してください。アクセスできない場合は、事前にマジックを用意してください。もちろん、トークン化にあらかじめ用意されたローカルモデルを使用することもできますが、この記事ではこの部分については触れません。
  • 一般に、大規模モデルデータの処理には、データのパディングとマスク処理が必要です。私たちのデータセットは小さく、各配列は固定長であるため、そのようなことはしませんでした。しかし、大規模で複雑なデータセットを作成したい場合は、データの選択とクリーニングを慎重に検討してください。このステップは非常に重要で、モデルの品質に大きく影響します。また、私たちのデータセットの処理は少々粗いかもしれませんが、実証例としては十分です。
  • トークナイザの機能そのものは、テキストを数字のリストに変換することです。私たちのデータ自体は数値なので、なぜトークン化するのでしょうか。個人的には、処理のアプローチは最終的なモデルのタスクプランニング次第だと思っています。モデルによって設計された機能とタスクが、データ処理方法を決定します。


大規模言語モデルの訓練

最初は、これが最も複雑な部分のように思えるかもしれませんが、GitHubのオープンソースプロジェクト「llm.c」の助けを借りれば、その訓練ファイルを使用するだけで大丈夫です。すべてのファイル内のコメントは非常に詳細で、ほぼすべてのステップについて説明があるため、この記事でコードを個別に分析したり解釈したりする必要はありません。
1.訓練開始前の準備
llm.cプロジェクトのURLは、https://github.com/karpathy/llm.cです。
この記事のサンプルコードプラットフォームは、以前紹介したWindows上にデプロイされたWSL環境で、Pythonインタプリタ環境にはminicondaを使用し、Pythonのバージョンは3.11.5です。
訓練を始める前に、git cloneを使用してllm.cプロジェクトをダウンロードし、プロジェクトのrequirements.txtで必要なライブラリがインストールされていること、WSLに make がインストールされていることを確認してください。


git clone  https://github.com/karpathy/llm.c.git

cd llm.c

pip install -r requirements.txt

2.モデルの訓練
まず、データを取得するためにWindowsでMetaTrader 5クライアントを開き、data_enc.pyというファイルの位置を確認し(このファイルもWindows環境に置く必要があります。WSLでデータが取得できるかどうかは試していません)、コマンド「python data_enc.py」を実行します。
python data_enc.py
スクリプトが実行されると、同じディレクトリにtrain_data.binとval_data.binという2つのファイルが生成されるので、WSLファイルシステムにコピーします。もちろん、WSLはWindowsファイルシステムの内容を完全に読み取ることができるので、ファイルをコピーすることは必須のステップではありません。
データを取得した後、llm.cプロジェクトのルートディレクトリにあるtrain_gpt2.pyファイルを実行する必要があります。リファレンスには2つの選択肢があります。
  • train_gpt2.pyの397行目の「--input_bin」のデフォルト値を「dev/data/mt5/val_data.bin」のようにデータファイルのパスに置き換えて、「python train_gpt2.py」を実行する
  • 例えば、「python train_gpt2.py --input_bin dev/data/mt5/val_data.bin」のように、コマンドラインに直接パラメータを追加して、データファイルを指定する

ここでは、コマンドラインで引数を指定して実行することにしました。

python train_gpt2.py --input_bin dev/data/mt5/val_data.bin

実行結果
tpy

結果は 「<|endoftext|>残りの40のうちの残りの20%のうちの残りの80%のうちの 40%」となります。このテスト出力は、ちょっと予想外に奇妙に思えます。しかし、前進を止めるわけにはいきません。

実のところ、train_gpt2.pyファイルはモデルを完全に学習するのではなく、モデルを初期化するためにデータセットからバッチを取得し、4つの.bin形式のファイルを保存します。

  • gpt2_124M.binとgpt2_124M_bf16.bin(それぞれfloat32形式とbfloat16形式で保存されたモデルパラメータファイル)
  • gpt2_tokenizer.bin(トークナイザファイル)
  • gpt2_124M_debug_state.bin(C言語のデバッグ用ファイル)


スクリプトの実行中に、推論のいくつかのステップが実行され、結果が出力されます。これはモデルの予備テストとして機能します。ファイル内の他のコードについては、この記事ではこれ以上説明しません。ソースコードには非常に詳細なコメントがあり、読者はプロセス全体を明確に理解することができます。
train_gpt2.pyスクリプトを実行した後、訓練コードをコンパイルする必要があります。しかし、コンパイルの前に、CPU上で訓練するために、ソースコード「train_gpt2.c」のデータ読み込みパスを修正する必要もあります。このCファイルの1041行目あたりに、「const char* train_tokens」と「const char* val_tokens」という2つの定数が定義されているので、それらの値を独自の「train_data.bin」と「val_data.bin」のパスに変更する必要があります。例えば、以下は私が手を加えた後のものです。
    const char* train_tokens = "dev/data/mt5/train_data.bin";
    const char* val_tokens = "dev/data/mt5/val_data.bin";

Pythonの構文とは異なるので、文末の「;」をお忘れなく。同様に、私はこのファイルのソースコードをあまり解釈したくはありません。著者のソースコードには詳細なコメントが含まれており、訓練の全過程を簡単に理解することができるからです。
ソースコードを修正した後、コマンドラインで直接「make train_gpt2」を実行します。CUDAアクセラレーションコンピューティングライブラリをインストールしていない場合、このコマンドは訓練ソースコードをCPU上で実行可能なプログラムに直接コンパイルします。

下図のようになります。


訓練プログラムのコンパイルに成功したら、大規模言語モデルの訓練を正式に開始することができます。コマンド「OMP_NUM_THREADS=10 ./train_gpt2」をコマンドラインで直接実行します。ここで、OMP_NUM_THREADSパラメータは、使用するスレッド数を指定します。ご使用のハードウェアデバイスがサポートするスレッド数の合計に応じて適切な値を設定してください。

実行結果

t

この訓練過程でのテスト出力は以下の通りです。

```

generating: --- 30.605360.605540.605590.605510.605650.605510.605650.60550.605550.605540.605590.605540.605590.606107<|endoftext|>0.605640.60 --- ```
さて、元データを振り返ってみると、私自身のllm_data.csvファイルの値はこのようになっています。
d

比較してみましょう。元の値はほとんどが0.6前後なので、出力には区切り文字が欠けているようです。前述したように、私たちのデータ形式は「 x,x,x,x,...」ですが、出力は「xxxxxxx...」のように見えます。ただし、私たちのアイデアは検証済みであり、単純に訓練された大規模モデルは私たちが望む結果を出力することができるので、これは問題ではないと思います。この道は実現可能であり、細かい問題はエンコードとデコードのプロセスを最適化することで解決できます。
これは単なるデモ例なので、モデルの保存やクライアントでの取引戦略のテストについては触れていません。さらに、CPU上で学習したモデルは、精度の問題から保存してテストする必要がありません。本当に使えるモデルにしたいのであれば、科学的なプロセスを確立し、もっと努力する必要があるのではないでしょうか。例えば、特定のタスクのためのデータセットの設計、適切な取引戦略の策定、タスクの要件を満たすエンコーダーとデコーダーのモデルの設計と訓練、モデルのハイパーパラメータの設定などです。これらはすべて、完成させるためには多くの練習が必要です。これを数回の記事で明確に説明できるとは考えにくいので、このプロセスはまだ読者が自分で探求する必要があります。この記事は、より多くの可能性を提供するだけです。

もちろん、訓練した言語モデルを取引戦略やテストにどう使用するかという問題も生じます。最も単純な例としては、Python環境で大規模なモデル推論サービスを実行し、取引戦略EAを通じてソケット経由でサービスリクエストを送信し、推論サービスが結果を計算してEAに返すことができます。この部分については、「時系列マイニングのためのデータラベル(その5):Socketを使ったEAでの応用とテスト」の記事で詳しく解説しているので、興味のある読者はお試しください。この記事では、関連する内容については改めて触れません。

記事末尾にデータ処理スクリプトファイルと取得データファイルを添付していますが、処理したbin形式ファイルはbin形式アップロードに対応していないため、添付ファイルには含まれていません。



WSLルート下のmntディレクトリには、私たちのWindowsのすべてのドライブ文字を見ることができます。「/mnt/g/Program Files」など、WSLから対応するドライブ文字の下にWindowsのファイルを見つけることができます。例のようにWindowsフォルダの名前にスペースが含まれている場合、「cd /mnt/g/Program Files」で直接このフォルダに入ることはできないため、「cd /mnt/g/'Program Files'」のように引用符を使用してフォルダ名をスペース文字で囲む必要があります。


結論

CPUだけで大規模言語モデルの学習に成功したのですから、すごいことです。

しかし、興奮するのはまだ早いです。この記事は、簡単な例を使ってCPUで独自の大規模言語モデルを訓練する方法を示しただけであり、明らかにハードウェアの条件に制約されています。CPUで訓練したモデルは単機能で性能が劣るかもしれませんが、クオンツ取引で特定の戦略を実行するための選択肢になる可能性も否定できません。

次回は、グラフィックカードを使用してモデルの訓練を加速させる方法を紹介します。AMDのグラフィックカードをご使用の方は、AMDのアクセラレーションが様々な一般的なライブラリでサポートされていないことに気づき、苛立たれるもしれません(もちろん、これは現段階、つまり筆者がこの記事を書いた時点の話です。長期的な視点に立てば、AMDのAIエコシステムは近い将来より良くなると私は信じています。あるいは、すべてのプラットフォームをサポートする「llama.cpp」のようなAIエコシステムがもっと普及するでしょう)。そこで、できるだけすべてのプラットフォームをカバーするという当初の意図に沿って、次回はAMDグラフィックカードを使って大規模言語モデルの学習を高速化する方法について説明します。私は現在、AMDのプラットフォームを使っているので、NVIDIAのグラフィックカードをアクセラレーションコンピューティングに使用する方法については触れないかもしれませんが、アクセラレーション訓練にAMDを使えるのであれば、より優れたAIエコシステムを持つNVIDIAで余計なことをする必要はないでしょう。

では、次回の記事でお会いしましょう。


参照文献

llm.c:https://github.com/karpathy/llm.c.git


MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/13920

添付されたファイル |
data_enc.py (2.87 KB)
llm_data.csv (1139.04 KB)
MQL5取引ツールキット(第1回):ポジション管理EX5ライブラリ MQL5取引ツールキット(第1回):ポジション管理EX5ライブラリ
MQL5で様々なポジション操作を管理するための開発者用ツールキットの作成方法をご紹介します。この記事では、MQL5でポジション管理タスクを処理する際に発生するさまざまなエラーの自動処理とレポートも含め、簡単なものから高度なものまでポジション管理操作を実行する関数ライブラリ(ex5)の作成方法を紹介します。
古典的戦略の再構築:原油 古典的戦略の再構築:原油
この記事では、教師あり機械学習アルゴリズムを活用することで、古典的な原油取引戦略を強化することを目的として、原油取引戦略を再検討します。ブレント原油価格とWTI原油価格のスプレッドに基づいて、将来のブレント原油価格を予測する最小二乗モデルを構築します。目標は、将来のブレント価格変動の先行指標を特定することです。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
予測による統計的裁定取引 予測による統計的裁定取引
統計的裁定取引について調べ、共和分で相関する銘柄をPythonで検索し、ピアソン係数の指標を作成し、PythonとONNX モデルで予測をおこなって統計的裁定取引を行うEAを作成します。