Upgrade to Pro — share decks privately, control downloads, hide ads and more …

メモリプロファイラMemrayのススメ

Manabu TERADA
October 28, 2023

 メモリプロファイラMemrayのススメ

PyCon APAC 2023 Day 2 Talk
Manabu TERADA (寺田 学)
2023-10-28

Manabu TERADA

October 28, 2023
Tweet

More Decks by Manabu TERADA

Other Decks in Technology

Transcript

  1. copyright © 2023 CMS Comunications Inc. all rights reserved. メモリプロファイラ

    Memray のススメ ─Pythonのメモリプロファイラの紹介─ 株式会社CMSコミュニケーションズ 代表取締役 寺田 学 (Manabu TERADA) 「PyCon APAC 2023」 2023年10月28日
  2. copyright © 2023 CMS Comunications Inc. all rights reserved. 記事が公開されている:

    今日はデモ多め 文章 で読みたい方 gihyo.jp Python Monthly Topics 2023年6月 メモリプロファイラ「Memray」の解説 https://gihyo.jp/article/2023/06/monthly-python-2306
  3. copyright © 2023 CMS Comunications Inc. all rights reserved. 講演の流れ

    • 自己紹介 • メモリプロファイラとは • Python用メモリプロファイラMemrayの紹介 • Memrayの基本的な使い方 • Pythonのコーディングによる違い • NumPyを使った確認 • 一歩進んだ使い方
  4. copyright © 2023 CMS Comunications Inc. all rights reserved. 自己紹介

    寺田 学 (Manabu TERADA) • Pythonエンジニア • Podcast 「terapyon channel」(https://podcast.terapyon.net) • 主な関連書籍(共著・監修・監訳) ◦ Pythonデータ分析 実践ハンドブック (インプレス: 2023年9月) ◦ Pythonによるあたらしいデータ分析の教科書第 2版(翔泳社:2022年10月) ◦ Python実践レシピ (技術評論社: 2022年1月) ◦ スラスラわかるPython第2版(翔泳社:2021年11月) ◦ 機械学習図鑑(翔泳社 : 2019年4月)
  5. copyright © 2023 CMS Comunications Inc. all rights reserved. 主な役職

    寺田 学 (Manabu TERADA) 株式会社 CMSコミュニケーションズ 代表取締役 • Pythonエンジニア • 一般社団法人PyCon JP Association 理事 • 一般社団法人Pythonエンジニア育成推進協会顧問理事 • Python Software Foundation (PSF) Fellow • 国立大学法人一橋大学 社会学研究科 元客員准教授(2022)
  6. copyright © 2023 CMS Comunications Inc. all rights reserved. メモリプロファイラとは

    • 必要性 • 2つの手法を紹介 • ツールの紹介 • プロファイリングの難しさ
  7. copyright © 2023 CMS Comunications Inc. all rights reserved. メモリプロファイラの必要性

    メモリ状態を管理していますか? • 実行にどのくらいメモリを使うのか知りたい • 実行が止まるが、どこでメモリを使っているか知りたい • コードやライブラリによるメモリ使用量の違いを知りたい • 大規模データを実メモリ内で処理できるデータ量を知りたい
  8. copyright © 2023 CMS Comunications Inc. all rights reserved. 2つの手法を紹介

    トレーシング(tracing ) • すべての状況を知る • メモリ確保・開放に ◦ 追加処理を入れる • 実行速度への影響 サンプリング(sampling ) • 定期的にデータ取得 • OSに問い合わせる • 統計的手法 or
  9. copyright © 2023 CMS Comunications Inc. all rights reserved. 手法ごとのツールの紹介

    トレーシング(tracing ) • Memray ◦ このトークのメイン サンプリング(sampling ) • psutil ◦ ベーシックなツール • memory-profiler ◦ メンテナンス終了 ◦ psutilに依存
  10. copyright © 2023 CMS Comunications Inc. all rights reserved. プロファイリングの難しさ

    • 統計的なデータ取得で良いのか? • ピンポイントの状況把握が必要なときどうする? • トレーシングで、実行負荷や実行速度に影響ない? • 実際にどのオブジェクトがメモリを使っているか知りたい ◦ サンプリング手法では完全把握できない
  11. copyright © 2023 CMS Comunications Inc. all rights reserved. Python用メモリプロファイラ

        Memrayの紹介 • MemrayはPyCon US 2022でお披露目 • Memrayの概要 • Memrayのインストール方法
  12. copyright © 2023 CMS Comunications Inc. all rights reserved. MemrayはPyCon

    US 2022 LTでお披露目 https://youtu.be/1IiL31tUEVk?si=JoAkPTdvkw30Avf1&t=951
  13. copyright © 2023 CMS Comunications Inc. all rights reserved. Memrayの概要

    • トレーシング手法を採用 • LinuxとmacOSに対応 (Windowsには対応していない) ライブラリ名 memray Pythonバージョン Python 3.8以降 公式サイト https://bloomberg.github.io/memray/index.html PyPI https://pypi.org/project/memray/ GitHub https://github.com/bloomberg/memray 現在のバージョン 1.10.0
  14. copyright © 2023 CMS Comunications Inc. all rights reserved. Memrayの歴史・開発者

    • ブルームバーグの社内ツールとして開発スタート • 2022年4月にOSS化 • Pablo Galindo Salgado氏が開発をリード ◦ Pythonのコアデベロッパー ◦ CPythonのリリースマネジャー ◦ 現在 Council メンバーでもある
  15. copyright © 2023 CMS Comunications Inc. all rights reserved. インストール方法

    $ pip install memray memrayコマンドが使えるようになる
  16. copyright © 2023 CMS Comunications Inc. all rights reserved. Memrayの基本的な使い方

    • プロファイルの実行 • 結果をHTMLで表示 • 現状をライブで見る
  17. copyright © 2023 CMS Comunications Inc. all rights reserved. プロファイルの実行方法

    $ memray run モジュール sample.py のプロファイリングをする場合 $ memray run sample.py memray-...bin というファイルが出力
  18. copyright © 2023 CMS Comunications Inc. all rights reserved. 結果をHTMLで表示

    $ memray flamegraph 結果ファイル名 runで実行した時に出力れた結果ファイル memray-...bin を使って結果をHTML化 $ memray flamegraph memray-...bin memray-flamegraph-sample.py.xxxx.html というファイルが出力
  19. copyright © 2023 CMS Comunications Inc. all rights reserved. 現状をライブで見る

    $ memray run --live モジュール コンソールに実行時の状況がライブで表示 $ memray run --live sample.py 別コンソールに出力する --live-remote モードもある リモートモードは表示確認を始めないと、スクリプトが動かない
  20. copyright © 2023 CMS Comunications Inc. all rights reserved. Pythonのコーディングによる    

    違い • メモリの確保状況の違い(リストオブジェクトの状況) • 実行時間の違いも見れる
  21. copyright © 2023 CMS Comunications Inc. all rights reserved. メモリの確保状況の違い(リストオブジェクトの状況)

    import time SIZE = 1024 * 1024 * 1024 # 1G time.sleep(1) # リスト内包表記でリストを生成 result = [1 for _ in range(SIZE)] time.sleep(1) del result # 変数を削除 time.sleep(1) sample-list.py を準備 result2 = [] # for文とappendメソッドでリストを生成 for i in range(SIZE): result2.append(1) time.sleep(1) del result2 # 変数を削除 time.sleep(1) result3 = [1] * SIZE # 掛け算でリストを生成 time.sleep(1) del result3 # 変数を削除 time.sleep(1)
  22. copyright © 2023 CMS Comunications Inc. all rights reserved. メモリの確保状況の違い(リストオブジェクトの状況)

    $ memray run sample-list.py 結果ファイルのファイル名を記録しHTML出力 $ memray flamegraph memray-...bin
  23. copyright © 2023 CMS Comunications Inc. all rights reserved. NumPyを使った確認

    • メモリ確保の可視化 • C拡張でも状況がきちんとわかる
  24. copyright © 2023 CMS Comunications Inc. all rights reserved. NumPyのメモリ確保の可視化

    import time import numpy as np SIZE = 1024 * 1024 * 1024 # 1G time.sleep(1) # 要素数が約1億個のNumPy配列を # 8bit整数型で生成 arr = np.ones(SIZE, dtype=np.uint8) time.sleep(1) # 同じ変数名に同じ配列を再代入 arr = np.ones(SIZE, dtype=np.uint8) sample-arr.py を準備 time.sleep(1) # 変数を削除 del arr time.sleep(1) arr = np.ones(SIZE, dtype=np.uint8) time.sleep(1) # 別の変数に代入 arr2 = np.ones(SIZE, dtype=np.uint8) time.sleep(1)
  25. copyright © 2023 CMS Comunications Inc. all rights reserved. NumPyのメモリ確保の可視化

    $ memray run sample-arr.py 結果ファイルのファイル名を記録しHTML出力 $ memray flamegraph memray-...bin
  26. copyright © 2023 CMS Comunications Inc. all rights reserved. NumPyのメモリ確保の可視化

    画面キャプチャ 変数上書きの瞬間、 2倍のメモリ量を要求している
  27. copyright © 2023 CMS Comunications Inc. all rights reserved. C拡張の状況

    $ memray run --native sample-arr.py --nativeモードを使う $ memray flamegraph memray-...bin 詳細の情報が表示される
  28. copyright © 2023 CMS Comunications Inc. all rights reserved. 一歩進んだ使い方

    • Jupyter Integration を使う • with ステートメントで部分的に状態を見る • pytest limit でテストにメモリ制限を設ける
  29. copyright © 2023 CMS Comunications Inc. all rights reserved. Jupyter

    Integration を使う %load_ext memray マジックコマンドでモジュールのロード %%memray_flamegraph セルマジックを使ってセル内の実行状況確認
  30. copyright © 2023 CMS Comunications Inc. all rights reserved. with

    ステートメントで部分的に状態を見る with Tracker("memray-profile.bin"): トレーシングしたい部分をwithブロックにする $ memray flamegraph memray-profile.bin flamegraphで結果をHTML化
  31. copyright © 2023 CMS Comunications Inc. all rights reserved. pytest

    limit でテストにメモリ制限を設ける $ pip install pytest-memray pytest拡張をインストール @pytest.mark.limit_memory("24 MB") def test_foobar(): pass
  32. copyright © 2023 CMS Comunications Inc. all rights reserved. まとめ

    • メモリプロファイリングをやってみよう。 • コードによる違いを確認しよう。 • メモリ不足への対処に強くなろう。