Link Search Menu Expand Document

EEGLABと高性能コンピューティング

目次
  • トピックス

EEGLABと神経科学ゲートウェイ

NEuroscience Gateway(NSG)を経由して、サンディエゴのスーパーコンピューターにEEGLABを稼働させるプロジェクトを募りました。 アカデミアは、世界中のアカデミアを無料で提供しています。 NSGでEEGLABを使用するドキュメントは、 NSGportal GitHub ウィキ.

ディープラーニングとEEGLAB

ディープラーニングは、EEGデータに応用した普及・深層学習が急激に増加しています。 EEGLABでは、ディープラーニングや機械学習のためのデータの準備をおすすめします。 EEGLAB のデータ epochs は MATLAB または Python (EEGLAB のデータセットは、scipy ライブラリの loadmat 関数を使用して Python で読み込まれ、ディープラーニングネットワークの入力として使用されます。 MATLAB では、複数のデータセットを EEGLAB に同じ数のチャンネルと同じ数の epochs あたりのサンプルの同じ数で読み込み、タイプ:

X = cat(3, ALLEEG.data); % concatenate trials
X = permute(X, [3 1 2]);
X = reshape(X, size(X,1), size(X,2)*size(X,3));

今では、Xには、ディープラーニングや機械学習アプリケーションに使用できる機能のベクトル(EEGデータエポックあたり1列)が含まれています。

GPUでEGLABを実行(グラフィック処理ユニット)

はじめに

GPU ベースの処理は MATLAB で有望です。 GPU(グラフィカル処理ユニット)の使用に関する最近の熱意 計算能力は私達を自由に利用できるGPUを試みるために導きました MATLABのソリューション GPUは通常、GPUを使用して計算するだけを含む 変数を再キャストし、MATLABスクリプトへのマイナーな変更が必要 関数。

当社のサーバーの一つは、Quad Core IntelTM Xeon W3550 3.0GHz、8M L3、 4.8GT/s、ターボおよび1つのnVidia GTXのタイタン(2688 CUDAの中心)があります、 MATLAB がすべての CUDA コアを使用するかどうかは不明ですが(ベース) MATLABのメッセージは以下のとおりです。 このページ上のすべてのテストは、中央値と比較して GPUユニットを搭載したプロセッサ。 MATLAB に “gpuDevice” を入力するとき コマンドライン、次のメッセージが表示されます。

gpuDevice

ans =

  CUDADevice with properties:

                      Name: 'GeForce GTX TITAN'
                     Index: 1
         ComputeCapability: '3.5'
            SupportsDouble: 1
             DriverVersion: 10.2000
            ToolkitVersion: 10
        MaxThreadsPerBlock: 1024
          MaxShmemPerBlock: 49152
        MaxThreadBlockSize: [1024 1024 64]
               MaxGridSize: [2.1475e+09 65535 65535]
                 SIMDWidth: 32
               TotalMemory: 6.3787e+09
           AvailableMemory: 5.3827e+09
       MultiprocessorCount: 14
              ClockRateKHz: 875500
               ComputeMode: 'Default'
      GPUOverlapsTransfers: 1
    KernelExecutionTimeout: 0
          CanMapHostMemory: 1
           DeviceSupported: 1
            DeviceSelected: 1

GPUを用いた基本的な行列計算は、大きなスピードアップを提供

GPUstart;

EEG = pop_loadset('sample_data/eeglab_data_epochs_ica.set');
data = [EEG.data(:,:)];
data = [data data data data data data ];
data = [data data data data data data ];
data2 = gpuArray(data);

tic; tmp = power(complex(data2), complex(1.3,0)); toc
Elapsed time is 0.000393 seconds

tic; tmp = data.^1.3; toc
Elapsed time is 0.689292 seconds

EEGデータ行列の各値をフラクショナルパワー(1.3)に上げる 中央プロセッサではなくGPUを使用して2000xの速度を生成 増加。

GPUで非パラメトリックな統計を実行して、処理を50回スピードアップ

GPU対応(MATLAB GPU機能はすべて下部で利用可能) こちら

c = { single(rand(400,800,100)) single(rand(400,800,100)); ...
          single(rand(400,800,100)) single(rand(400,800,100))};
tic; [FC FR FI dfc dfr dfi] = anova2_cell(c); toc
Elapsed time is 0.24665 seconds.

c = { gpuArray(single(rand(400,800,100))) gpuArray(single(rand(400,800,100))); ...
      gpuArray(single(rand(400,800,100))) gpuArray(single(rand(400,800,100)))};
tic; [FC FR FI dfc dfr dfi] = anova2_cell_gpu(c); GPUsync; toc
Elapsed time is 0.005052 seconds.

GPUの計算は、使用時に約50倍速くなるように見えました メインCPU。 より小さい行列の場合、GPUとCPUコードの実装の違い 小さいかもしれません。

時間の頻度分解のためのGPUを使用して10xのスピードアップを提供します

EEG = pop_loadset('sample_data/eeglab_data_epochs_ica.set');
data2 = EEG.data;
tic; timefreq(data2, EEG.srate, 'cycles', 0); toc
Elapsed time is 0.3517511 seconds.

data = gpuArray([EEG.data(:,:)]);
tic; timefreq_gpu(data, EEG.srate, 'cycles', 0); toc
Elapsed time is 0.038354 seconds.

ここでは、10倍のスピードアップを時間頻度で実行して観察しました CPU ではなく GPU でデコンポジションを解除します。 実行する 各関数は複数回、メモリ割り当ては結果に影響を与えません(GPUの最初の反復は時々遅くなります)。 注意する 上記のコードは、自動的に並列を使用するFFT関数を使用します。 主要なプロセッサ(4つの中心がある)の計算、従って利点 シングルコアCPUと比較して約40倍になる可能性があるGPUを使用する。

GPUに関する結論 MATLABでの計算

2010年に最初のテストを走ったとき、市場で3つの選択肢がありました。 GPUmat(無料)、ジャケット(コマーシャル)、パラレルコンピューティングツールボックス MATLAB(コマーシャル) 全体的に、性能改善に不備があった。

2020年以降(これらのテストが実行された日付)、GPUソリューションが大幅に最適化され、弊社では すべてのソリューションの大きなスピードアップを観察できるようになりました。 GPU が 二重精度の数値と互換性がありますが、テストされていない ソリューション

EEGLAB 互換 GPU 機能をテストしました。 詳しくはこちらを参照してください。 これらの関数は 完全に機能しない(条件の限られたセットの下でのみ動作します) 上記のようにテストされ、従ってexploratoryのためにだけ利用できます テスト目的。

MATLABが私のコンピューティングリソースで利用できない場合

スーパーコンピュータやSingularity、MATLAB、非常に効率的ですが、 利用できない場合があります(ローカルスーパーコンピューターでご確認ください)。 2019年(EEGLAB 2019)現在、スーパーコンピューティングのOctave(v4.4.0)のサポートをしています。 アプリケーション。 ご参照ください。 こちら 使用方法 OctaveのEEGLAB。 短期的には、Octave は EEGLAB の機能を使用する最も簡単な方法であり、実際に有用な結果を得ることができます。

HadoopでEEGLABを使う

Hadoop Mapreduceは、大規模な計算を行うためのフレームワークです コンピュータのクラスター。 Mapreduceの仕事には2つのステップがあります:マッピング 多数の労働者(コンピュータ)が多数の数で働いた仕事 データラインの1つのワーカープールで、マッピング結果をすべて1つのステップを削減します。 このセクションは2013年に作成され、2021年に更新されました。

以下は、AmazonでElastic Mapreduceを使用するためのガイドラインを提供します。 クラウド。 Elastic Mapreduce は大きく処理するために合わせられます ログテキストファイルとバイナリデータの量。 条件のゲイン このようなソリューションの実行コストと比較して処理速度が残ります コンピューターのローカルクラスターを持っている場合は、不明です。 要するに、あなたはかもしれない ソリューションをプログラミングし、より多くの時間を費やすことができる ローカルで実行していたよりも、帯域幅とストレージの用語。 あなたが従うべきステップです。 エキスパート コンピュータサイエンスの推奨事項

  • Hadoopコマンドラインインターフェイスをインストールします。 まず、[コマンド] をインストールします。 ライン インターフェイス:(http://aws.amazon.com/developertools/2264) へ 伸縮性があるMapreduce。 これにより、ジョブの設定と実行ができます。 Amazonクラウド。 [AWS] を作成する必要があります。 参照: AWS)。 Hadoopは実行する必要があります ストリーミングモード、データが単に実行可能にストリーミングされる場所。 ネイティブJavaモードでHadoopを実行することも可能です。 Java ビルダーを使用して MATLAB のコードをコンパイルします(これは ストリーミングモードよりも複雑です。

  • データをAmazonストレージクラウドに転送(Amazonストレージクラウド) S3と名付けます。 あなたのデータ 文字の文字列でフォーマットする必要があります。 注意: 未加工EEGデータを処理する、テキストでそれをシリアライズする必要があります</b>, テキストの1列を表す各チャネル(Hadoopはバイナリデータを処理することもありますが、その機能を試してみました)。 ありません テキストの行の長さに制限します。 しかし、覚えなければならない 信号処理と帯域幅の両面のオーバーヘッド 処理テキストに関連した。 128 チャンネルと 100 がある場合 データファイルでは、Hadoopの処理手順12,800に対応しています。 タスクに1,000人の労働者を割り当てることができます。これはそれぞれを意味します ワーカーは、約13チャンネルを処理します, 約の潜在的なスピードアップ タスクで1,000円 帯域幅のオーバーヘッドを最小限に抑えるには、 圧縮されたバイナリデータをS3に転送し、ローカルamazonを持っています EC2 amazon ノードはそれを解凍し、それを S3 に戻します(これは、 S3のEC2ノードの帯域幅は無料です。

  • ソリューション1(実装が最も簡単です) EEGLABコマンドライン コードは互換性があります オタクを参照してください。 Octaveは ノードの各ノードに比較的簡単にインストール boottrappingメソッド(ソフトウェアを自動的にインストールする方法) 各ノード。 Octave を自動的にインストールするコマンド EC2 Amazon ノードは sudo yum –y は octave –enablerepo=epel をインストールします。

    HadoopはSTDINとSTDOUTパイプを介して労働者と通信します。 メインのMATLABスクリプトでは、次の追加が必要 メインスクリプトの先頭で。 これは実行可能になり、 STDINでデータを処理できるようにします。 可能です。 printf または disp MATLAB を使用してデータ処理の出力を書きます コマンド。

    #!/usr/bin/octave -qf
    Q = fread(stdin); %Standard Octave / MATLAB code from here on
    
  • ソリューション2、MATLABコードのコンパイル MATLABコードのコンパイルが最も多く MATLABのコンパイルコードとして効率的なソリューションは、多くの場合2〜4回 Octaveコードよりも速く、コンパイルされたコードはMATLABを必要としません ライセンス ローカルのUnixワークステーションでMATLABコードをコンパイルすると、 Amazon AMI(仮想マシン)を必ず使用する必要があります。 image) ライブラリの同じセットで、コードが実行できるように その機械。 互換性のあるAMIを選ぶ必要があります。 ハドープも。 また、MATLABには簡単な機構はありません。 STDINから読み込むことができます。 最も簡単な解決策は、サードパーティのコンパイルされたMexファイルを使用して行うことです(例えば、参照してください popen). 別のソリューションは、ディスクにSTDINを書くシェルコマンドを持つことです。 MATLAB実行可能(ただし、これは不公平である可能性があります) パフォーマンス)。

  • ステップを減らす:すべての労働者が何をすべきかを計算したら 計算(例の分光力)は、ステップを減らすことはそれを書くかもしれません S3 Amazonのストレージをバックアップ(さらに処理を行う) 同じに属するバックチャネルをグループ化することなど トピック

  • Hadoop を実行: AWS コマンド ライン インターフェイスを使用して、何かをタイプして下さい 以下のような。

    elastic-mapreduce --create --stream --input s3n://Arno/myEEGserializedtextfiles/ \
    --mapper s3://Arno/process_octave \
    --reducer s3://Arno/reducer.py \
    --output s3n://Arno/output --debug --verbose \
    --log-uri s3n://Arno/logs --enable-debugging \
    --bootstrap-action s3n://Arno/install_octave
    
  • 任意のプログラミング言語でステップを減らすことができます STDINからデータを取り、STDOUTに書き込む。 減らされたステップは通常通ります EEGLABコマンドを実行する必要はありません。 データをプールするだけでは、 労働者を要約し、それを要約します。 このケースでは、Python のカスタム プログラムですが、Octave/MATLAB もあるので 作業者のそれぞれにOctaveをインストールします。 あなたの正確なコンテンツ コードは、やりたいタスクに依存します。

上記の解決策は、対処するときにのみ試すべきです ローカルプロセッサやクラスターが処理できない大量のデータ。 ですから ブートストラップデータが必要な場合に最適(計算ロット) 小さなデータ)。 ご意見・ご要望等ございましたら、お気軽にお問い合わせください。 [email protected].