Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

copyright © 2023 CMS Comunications Inc. all rights reserved. 自己紹介

Slide 5

Slide 5 text

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月)

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

copyright © 2023 CMS Comunications Inc. all rights reserved. Python技術支援のコンサルサービス (株)CMSコミュニケーションズのサービス

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

copyright © 2023 CMS Comunications Inc. all rights reserved. メモリプロファイラの必要性 メモリ状態を管理していますか? ● 実行にどのくらいメモリを使うのか知りたい ● 実行が止まるが、どこでメモリを使っているか知りたい ● コードやライブラリによるメモリ使用量の違いを知りたい ● 大規模データを実メモリ内で処理できるデータ量を知りたい

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

copyright © 2023 CMS Comunications Inc. all rights reserved. 手法ごとのツールの紹介 トレーシング(tracing ) ● Memray ○ このトークのメイン サンプリング(sampling ) ● psutil ○ ベーシックなツール ● memory-profiler ○ メンテナンス終了 ○ psutilに依存

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

copyright © 2023 CMS Comunications Inc. all rights reserved. Python用メモリプロファイラ     Memrayの紹介 ● MemrayはPyCon US 2022でお披露目 ● Memrayの概要 ● Memrayのインストール方法

Slide 14

Slide 14 text

copyright © 2023 CMS Comunications Inc. all rights reserved. Memray!!

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

copyright © 2023 CMS Comunications Inc. all rights reserved. MemrayとPyCon US 2023で再会 https://youtu.be/mqu66lg79X8

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

copyright © 2023 CMS Comunications Inc. all rights reserved. インストール方法 $ pip install memray memrayコマンドが使えるようになる

Slide 20

Slide 20 text

copyright © 2023 CMS Comunications Inc. all rights reserved. Memrayの基本的な使い方 ● プロファイルの実行 ● 結果をHTMLで表示 ● 現状をライブで見る

Slide 21

Slide 21 text

copyright © 2023 CMS Comunications Inc. all rights reserved. プロファイルの実行方法 $ memray run モジュール sample.py のプロファイリングをする場合 $ memray run sample.py memray-...bin というファイルが出力

Slide 22

Slide 22 text

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 というファイルが出力

Slide 23

Slide 23 text

copyright © 2023 CMS Comunications Inc. all rights reserved. 結果をHTMLで表示 (画面キャプチャ)

Slide 24

Slide 24 text

copyright © 2023 CMS Comunications Inc. all rights reserved. 結果をHTMLで表示 (グラフポップアップ)

Slide 25

Slide 25 text

copyright © 2023 CMS Comunications Inc. all rights reserved. プロファイルの実行と結果をHTMLで表示 デモ

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

copyright © 2023 CMS Comunications Inc. all rights reserved. 現状をライブで見る (画面キャプチャ)

Slide 28

Slide 28 text

copyright © 2023 CMS Comunications Inc. all rights reserved. 現状をライブで見る デモ

Slide 29

Slide 29 text

copyright © 2023 CMS Comunications Inc. all rights reserved. Pythonのコーディングによる     違い ● メモリの確保状況の違い(リストオブジェクトの状況) ● 実行時間の違いも見れる

Slide 30

Slide 30 text

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)

Slide 31

Slide 31 text

copyright © 2023 CMS Comunications Inc. all rights reserved. メモリの確保状況の違い(リストオブジェクトの状況) $ memray run sample-list.py 結果ファイルのファイル名を記録しHTML出力 $ memray flamegraph memray-...bin

Slide 32

Slide 32 text

copyright © 2023 CMS Comunications Inc. all rights reserved. メモリの確保状況の違い 画面キャプチャ 実行時間の違いも一目瞭然

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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)

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

copyright © 2023 CMS Comunications Inc. all rights reserved. NumPyのメモリ確保の可視化 画面キャプチャ 変数上書きの瞬間、 2倍のメモリ量を要求している

Slide 37

Slide 37 text

copyright © 2023 CMS Comunications Inc. all rights reserved. C拡張の状況 $ memray run --native sample-arr.py --nativeモードを使う $ memray flamegraph memray-...bin 詳細の情報が表示される

Slide 38

Slide 38 text

copyright © 2023 CMS Comunications Inc. all rights reserved. C拡張の状況 画面キャプチャ

Slide 39

Slide 39 text

copyright © 2023 CMS Comunications Inc. all rights reserved. NumPyオブジェクトをnativeモード デモ

Slide 40

Slide 40 text

copyright © 2023 CMS Comunications Inc. all rights reserved. 一歩進んだ使い方 ● Jupyter Integration を使う ● with ステートメントで部分的に状態を見る ● pytest limit でテストにメモリ制限を設ける

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

copyright © 2023 CMS Comunications Inc. all rights reserved. Jupyter Integration を使う デモ

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

copyright © 2023 CMS Comunications Inc. all rights reserved. まとめ

Slide 46

Slide 46 text

copyright © 2023 CMS Comunications Inc. all rights reserved. まとめ ● メモリプロファイリングをやってみよう。 ● コードによる違いを確認しよう。 ● メモリ不足への対処に強くなろう。

Slide 47

Slide 47 text

copyright © 2023 CMS Comunications Inc. all rights reserved. ご清聴 ありがとうございました。

Slide 48

Slide 48 text

copyright © 2023 CMS Comunications Inc. all rights reserved. Q&A