Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

GraphcoreのIPUでも、ホストのメモリを使う?

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった 

Graphcoreが POPLIBS をオープンソース化したというのが昨日のブログ。

今日のブログでは、IPU でも ホストのメモリを使うというお話。

Graphcoreの IPU は内部SRAMをたっぷり持っているので、外部メモリ(DRAM)を接続するインターフェースを持っていません。ということは大きなモデルになってくると、そのモデルのパラメータがIPUの内部SRAMに乗りきらなくなるということ。そこで、今日のブログの内容になるのですが、ホストのメモリを使うというもの。

詳細は、下記のブログに書いてありまっす。この記事が出るまで、ホストのメモリはイメージデータやパラメータをIPUの内部に送り込む時だけ使うのだと思っていました。

www.graphcore.ai

このブログでは、IPUは

という2つのメモリにアクセスできると。In-Processor Memoryが今まで出てきた内部SRAMで、実際には各プロセッサ(PU)のローカルなSRAMになります。一方、Streaming Memoryはホストのメモリで各IPUに対して16GB割り当てている。DELLサーバーには8枚のIPUボード(16個のIPU)なので、256GB(Blogでは260GBとなっています)を使うと。

この Streaming Memory はユーザーが POPLAR API を使って、次のようにして使うようです(引用します)

// Add a remote buffer in streaming memory
auto r = graph.addRemoteBuffer("MyRemoteBuffer", FLOAT, 128, 10);

// Add a 2D graph variable in in-processor memory

auto v = graph.addVariable(FLOAT, {8, 16});

...

...

// Copy the variable into the remote buffer

prog.add(Copy(v, r));

...

 

addRemoteBuffer という API を使って、Streaming Memoryを割り当てるだけで移行は特に意識することなく使えるようです。

POPARTでは、

Devicex::createRemoteBufferという関数 

Devicex::getOrCreateHostReduceRemoteBufferという関数

の中で使われいます。

また、TensorFlowの中では、

RemoteParameterLoadOp

GetOrCreateRemoteBuffer

の中で呼ばれています。