GPUメモリが開放されない

109 views (last 30 days)
poni_poni
poni_poni on 17 Nov 2021
Commented: poni_poni on 18 Nov 2021
GeForce RTX1660 Parallel computing toolbox バージョン 7.4を使用しています
実行したい処理に対してGPUメモリが少ないためメモリをクリアしながらやりくりしたいのですが、意図した通りにGPUメモリが開放されません
具体的に困っている状況を再現したのが下記のコード、写真はコードを実行したときのタスクマネージャの画面です
画像上下の違いは変数のサイズです
画像上の場合、最後のgpuAray型変数であるp4を解放したときに一気にメモリが開放され、p0~p3を削除してもメモリが空きません
一方下の場合、3GBあたりまでは開放されるのですが、p3のclearが反映されておらず、こちらもp4で一気にp3の分も開放されます
この3GBはワークスペースに存在しないのですがどこにあるのでしょうか。また,この3GBを全てのgpuAray型の変数をクリアすることなく,プログラムの実行中に削除することはできますか。
これがGPUの問題なのか、MATLABのキャッシュ等の仕様なのかということがまだ判別できておりませんが、MATLAB側で解決できるのではないかと思い質問させていただきました。よろしくお願いいたします。
X = 1200; Y = 200; Z = 200; % 写真 上
% X = 1800; Y = 300; Z = 200; % 写真 下
p0=gpuArray.rand(X,Y,Z);
pause(3)
p1=gpuArray.rand(X,Y,Z);
pause(3)
p2=gpuArray.rand(X,Y,Z);
pause(3)
p3=gpuArray.rand(X,Y,Z);
pause(3)
p4=gpuArray.rand(X,Y,Z);
pause(3)
clear p0
pause(3)
clear p1
pause(3)
clear p2
pause(3)
clear p3
pause(3)
pause(3)
clear p4

Accepted Answer

Kojiro Saito
Kojiro Saito on 18 Nov 2021
これはGPU側にキャッシュが残っているためです。
gpuDevice (ドキュメント)のAvailableMemoryに説明がありますが、
「メモリのキャッシュにより、この値は NVIDIA® System Management Interface で報告される値と異なる場合があります。」
とあります。
gpuArrayを作成後とクリア後にGPUのメモリ使用量を表示するようにコードを変えてみました。
MATLABからgpuDeviceコマンドで選択されているGPU情報を取得し、gd.TotalMemory-gd.AvailableMemoryでMATLABから見たGPUのメモリ使用量が見えます。
また、nvidia-smiコマンドでGPUのキャッシュを含むメモリ使用量が確認できます。下記の「--id=0」のオプションはGPUが複数ささっていて、1台目のGPUデバイスの情報を表示させるためのオプションです。
すると、p0をクリアした直後、MATLABのgpuDeviceではメモリ使用量がすぐに減っていますが、nvidia-smiコマンドだと使用量がすぐには変わっていないことがわかりました。GPU側にキャッシュが残っているためです。
WindowsのタスクマネージャーからGPUのメモリ使用量を見るとnvidia-smiの値に近いことが分かりました。
キャッシュが削除されるタイミングはGPU側で制御されます。
nvidia-smi -caaコマンドや、MATLABからもgpuDeviceのreset コマンドがありますが、GPUのメモリが全て消去されてしまうので、特定のキャッシュだけ削除するというのは無さそうです。
ただ、キャッシュはいずれ削除されますし、現状のMATLABからclear p1などでGPU配列を消去してから新たにGPU配列を定義する方法で良いと思います。
clc;clear
X = 1200; Y = 200; Z = 200; % 写真 上
% X = 1800; Y = 300; Z = 200; % 写真 下
p0=gpuArray.rand(X,Y,Z);
gd = gpuDevice;
disp('p0');sprintf('%d MiB / %d MiB', round((gd.TotalMemory-gd.AvailableMemory)/1024/1024), round(gd.TotalMemory/1024/1024))
!nvidia-smi --id=0
pause(3)
p1=gpuArray.rand(X,Y,Z);
disp('p1');sprintf('%d MiB / %d MiB', round((gd.TotalMemory-gd.AvailableMemory)/1024/1024), round(gd.TotalMemory/1024/1024))
!nvidia-smi --id=0
pause(3)
p2=gpuArray.rand(X,Y,Z);
disp('p2');sprintf('%d MiB / %d MiB', round((gd.TotalMemory-gd.AvailableMemory)/1024/1024), round(gd.TotalMemory/1024/1024))
!nvidia-smi --id=0
pause(3)
p3=gpuArray.rand(X,Y,Z);
disp('p3');sprintf('%d MiB / %d MiB', round((gd.TotalMemory-gd.AvailableMemory)/1024/1024), round(gd.TotalMemory/1024/1024))
!nvidia-smi --id=0
pause(3)
p4=gpuArray.rand(X,Y,Z);
disp('p4');sprintf('%d MiB / %d MiB', round((gd.TotalMemory-gd.AvailableMemory)/1024/1024), round(gd.TotalMemory/1024/1024))
!nvidia-smi --id=0
pause(3)
clear p0
disp('cleared p0');sprintf('%d MiB / %d MiB', round((gd.TotalMemory-gd.AvailableMemory)/1024/1024), round(gd.TotalMemory/1024/1024))
!nvidia-smi --id=0
pause(3)
clear p1
disp('cleared p1');sprintf('%d MiB / %d MiB', round((gd.TotalMemory-gd.AvailableMemory)/1024/1024), round(gd.TotalMemory/1024/1024))
!nvidia-smi --id=0
pause(3)
clear p2
disp('cleared p2');sprintf('%d MiB / %d MiB', round((gd.TotalMemory-gd.AvailableMemory)/1024/1024), round(gd.TotalMemory/1024/1024))
!nvidia-smi --id=0
pause(3)
clear p3
disp('cleared p3');sprintf('%d MiB / %d MiB', round((gd.TotalMemory-gd.AvailableMemory)/1024/1024), round(gd.TotalMemory/1024/1024))
!nvidia-smi --id=0
pause(3)
clear p4
disp('cleared p4');sprintf('%d MiB / %d MiB', round((gd.TotalMemory-gd.AvailableMemory)/1024/1024), round(gd.TotalMemory/1024/1024))
!nvidia-smi --id=0
  1 Comment
poni_poni
poni_poni on 18 Nov 2021
ご回答ありがとうございます。
GPU側のキャッシュなのですね。理解しました。
実験するほどでもないかもしれませんが,p0~p4を作成したあと,p0~p2を削除し,その後にp0等と同じ大きさのp5,p6を確保したところタスクマネージャーで変化がありませんでした.(p7を確保したところキャッシュされた量を超えたため,p7分増えました)
回答者様のおっしゃる通り,タスクマネージャーで見える値と実際のメモリ占有量は異なり,我々がコーディングするときはMATLABのAvailableMemoryの方を意識すればよさそうです。
具体的なコードまで提示していただいて大変わかりやすかったです。ありがとうございました。

Sign in to comment.

More Answers (0)

Products


Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!