Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
メモリプロファイラMemrayのススメ
Search
Manabu TERADA
October 28, 2023
Technology
3
640
メモリプロファイラMemrayのススメ
PyCon APAC 2023 Day 2 Talk
Manabu TERADA (寺田 学)
2023-10-28
Manabu TERADA
October 28, 2023
Tweet
Share
More Decks by Manabu TERADA
See All by Manabu TERADA
LLMを用いたPloneベクター検索 アドオンの開発の説明
terapyon
0
20
PyCon APACの軌跡
terapyon
0
1.1k
Pythonエンジニアになるためのテクニカルハイライトと学習方法
terapyon
0
41
Multi lingual Vector search using LLM
terapyon
1
51
PoC for LLM search on Plone
terapyon
1
41
LLMを用いたPloneベクター検索 アドオンの開発状況の紹介
terapyon
0
53
オープンセミナー香川 Pythonの現状・データ分析・LLM
terapyon
0
450
コミュニティのつながりとPython @ DERTA GIG vol.3
terapyon
0
90
Python環境の今 2022
terapyon
0
1k
Other Decks in Technology
See All in Technology
長期間TiDBを使ってきた話 @ 私たちはなぜNewSQLを使うのかTiDB選定5社が語る選定理由と活用LT / Experiences with TiDB Over Time
chibiegg
3
910
反実仮想機械学習とは何か
usaito
PRO
12
4.7k
Java EE/Jakarta EEの現状と将来―クラウドネイティブ時代にJava EEは対応できるのか?―
takakiyo
1
170
生産性向上チームの紹介
cybozuinsideout
PRO
1
880
チームでロジカルシンキングに改めて向き合っている話 〜学習環境と実践⽅法〜
sansantech
PRO
3
2.8k
どうするコスト最適化のトレードオフ
tetsuyaooooo
1
530
「スニダン」開発組織の構造に込めた意図 ~組織作りはパッションや政治ではない!~
rinchsan
3
570
require(ESM)とECMAScript仕様
uhyo
3
790
一生覚えておきたい「システム開発=コミュニケーション」〜初めての実務案件振り返りLT〜
maimyyym
1
170
VS CodeでAWSを操作しよう
smt7174
8
1.7k
DMM.com アルファ室採用案内資料
hsugita
1
160
ServiceNow Knowledge 24の歩き方 EYストラテジー・アンド・コンサルティング
manarobot
0
200
Featured
See All Featured
Being A Developer After 40
akosma
57
580k
Debugging Ruby Performance
tmm1
70
11k
The MySQL Ecosystem @ GitHub 2015
samlambert
243
12k
Visualization
eitanlees
136
14k
Building Adaptive Systems
keathley
31
1.9k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
241
1.2M
VelocityConf: Rendering Performance Case Studies
addyosmani
320
23k
RailsConf 2023
tenderlove
4
540
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
155
14k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
What's new in Ruby 2.0
geeforr
337
31k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.6k
Transcript
copyright © 2023 CMS Comunications Inc. all rights reserved. メモリプロファイラ
Memray のススメ ─Pythonのメモリプロファイラの紹介─ 株式会社CMSコミュニケーションズ 代表取締役 寺田 学 (Manabu TERADA) 「PyCon APAC 2023」 2023年10月28日
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
copyright © 2023 CMS Comunications Inc. all rights reserved. 講演の流れ
• 自己紹介 • メモリプロファイラとは • Python用メモリプロファイラMemrayの紹介 • Memrayの基本的な使い方 • Pythonのコーディングによる違い • NumPyを使った確認 • 一歩進んだ使い方
copyright © 2023 CMS Comunications Inc. all rights reserved. 自己紹介
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月)
copyright © 2023 CMS Comunications Inc. all rights reserved. 主な役職
寺田 学 (Manabu TERADA) 株式会社 CMSコミュニケーションズ 代表取締役 • Pythonエンジニア • 一般社団法人PyCon JP Association 理事 • 一般社団法人Pythonエンジニア育成推進協会顧問理事 • Python Software Foundation (PSF) Fellow • 国立大学法人一橋大学 社会学研究科 元客員准教授(2022)
copyright © 2023 CMS Comunications Inc. all rights reserved. Python技術支援のコンサルサービス
(株)CMSコミュニケーションズのサービス
copyright © 2023 CMS Comunications Inc. all rights reserved. メモリプロファイラとは
• 必要性 • 2つの手法を紹介 • ツールの紹介 • プロファイリングの難しさ
copyright © 2023 CMS Comunications Inc. all rights reserved. メモリプロファイラの必要性
メモリ状態を管理していますか? • 実行にどのくらいメモリを使うのか知りたい • 実行が止まるが、どこでメモリを使っているか知りたい • コードやライブラリによるメモリ使用量の違いを知りたい • 大規模データを実メモリ内で処理できるデータ量を知りたい
copyright © 2023 CMS Comunications Inc. all rights reserved. 2つの手法を紹介
トレーシング(tracing ) • すべての状況を知る • メモリ確保・開放に ◦ 追加処理を入れる • 実行速度への影響 サンプリング(sampling ) • 定期的にデータ取得 • OSに問い合わせる • 統計的手法 or
copyright © 2023 CMS Comunications Inc. all rights reserved. 手法ごとのツールの紹介
トレーシング(tracing ) • Memray ◦ このトークのメイン サンプリング(sampling ) • psutil ◦ ベーシックなツール • memory-profiler ◦ メンテナンス終了 ◦ psutilに依存
copyright © 2023 CMS Comunications Inc. all rights reserved. プロファイリングの難しさ
• 統計的なデータ取得で良いのか? • ピンポイントの状況把握が必要なときどうする? • トレーシングで、実行負荷や実行速度に影響ない? • 実際にどのオブジェクトがメモリを使っているか知りたい ◦ サンプリング手法では完全把握できない
copyright © 2023 CMS Comunications Inc. all rights reserved. Python用メモリプロファイラ
Memrayの紹介 • MemrayはPyCon US 2022でお披露目 • Memrayの概要 • Memrayのインストール方法
copyright © 2023 CMS Comunications Inc. all rights reserved. Memray!!
copyright © 2023 CMS Comunications Inc. all rights reserved. MemrayはPyCon
US 2022 LTでお披露目 https://youtu.be/1IiL31tUEVk?si=JoAkPTdvkw30Avf1&t=951
copyright © 2023 CMS Comunications Inc. all rights reserved. MemrayとPyCon
US 2023で再会 https://youtu.be/mqu66lg79X8
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
copyright © 2023 CMS Comunications Inc. all rights reserved. Memrayの歴史・開発者
• ブルームバーグの社内ツールとして開発スタート • 2022年4月にOSS化 • Pablo Galindo Salgado氏が開発をリード ◦ Pythonのコアデベロッパー ◦ CPythonのリリースマネジャー ◦ 現在 Council メンバーでもある
copyright © 2023 CMS Comunications Inc. all rights reserved. インストール方法
$ pip install memray memrayコマンドが使えるようになる
copyright © 2023 CMS Comunications Inc. all rights reserved. Memrayの基本的な使い方
• プロファイルの実行 • 結果をHTMLで表示 • 現状をライブで見る
copyright © 2023 CMS Comunications Inc. all rights reserved. プロファイルの実行方法
$ memray run モジュール sample.py のプロファイリングをする場合 $ memray run sample.py memray-...bin というファイルが出力
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 というファイルが出力
copyright © 2023 CMS Comunications Inc. all rights reserved. 結果をHTMLで表示
(画面キャプチャ)
copyright © 2023 CMS Comunications Inc. all rights reserved. 結果をHTMLで表示
(グラフポップアップ)
copyright © 2023 CMS Comunications Inc. all rights reserved. プロファイルの実行と結果をHTMLで表示
デモ
copyright © 2023 CMS Comunications Inc. all rights reserved. 現状をライブで見る
$ memray run --live モジュール コンソールに実行時の状況がライブで表示 $ memray run --live sample.py 別コンソールに出力する --live-remote モードもある リモートモードは表示確認を始めないと、スクリプトが動かない
copyright © 2023 CMS Comunications Inc. all rights reserved. 現状をライブで見る
(画面キャプチャ)
copyright © 2023 CMS Comunications Inc. all rights reserved. 現状をライブで見る
デモ
copyright © 2023 CMS Comunications Inc. all rights reserved. Pythonのコーディングによる
違い • メモリの確保状況の違い(リストオブジェクトの状況) • 実行時間の違いも見れる
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)
copyright © 2023 CMS Comunications Inc. all rights reserved. メモリの確保状況の違い(リストオブジェクトの状況)
$ memray run sample-list.py 結果ファイルのファイル名を記録しHTML出力 $ memray flamegraph memray-...bin
copyright © 2023 CMS Comunications Inc. all rights reserved. メモリの確保状況の違い
画面キャプチャ 実行時間の違いも一目瞭然
copyright © 2023 CMS Comunications Inc. all rights reserved. NumPyを使った確認
• メモリ確保の可視化 • C拡張でも状況がきちんとわかる
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)
copyright © 2023 CMS Comunications Inc. all rights reserved. NumPyのメモリ確保の可視化
$ memray run sample-arr.py 結果ファイルのファイル名を記録しHTML出力 $ memray flamegraph memray-...bin
copyright © 2023 CMS Comunications Inc. all rights reserved. NumPyのメモリ確保の可視化
画面キャプチャ 変数上書きの瞬間、 2倍のメモリ量を要求している
copyright © 2023 CMS Comunications Inc. all rights reserved. C拡張の状況
$ memray run --native sample-arr.py --nativeモードを使う $ memray flamegraph memray-...bin 詳細の情報が表示される
copyright © 2023 CMS Comunications Inc. all rights reserved. C拡張の状況
画面キャプチャ
copyright © 2023 CMS Comunications Inc. all rights reserved. NumPyオブジェクトをnativeモード
デモ
copyright © 2023 CMS Comunications Inc. all rights reserved. 一歩進んだ使い方
• Jupyter Integration を使う • with ステートメントで部分的に状態を見る • pytest limit でテストにメモリ制限を設ける
copyright © 2023 CMS Comunications Inc. all rights reserved. Jupyter
Integration を使う %load_ext memray マジックコマンドでモジュールのロード %%memray_flamegraph セルマジックを使ってセル内の実行状況確認
copyright © 2023 CMS Comunications Inc. all rights reserved. Jupyter
Integration を使う デモ
copyright © 2023 CMS Comunications Inc. all rights reserved. with
ステートメントで部分的に状態を見る with Tracker("memray-profile.bin"): トレーシングしたい部分をwithブロックにする $ memray flamegraph memray-profile.bin flamegraphで結果をHTML化
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
copyright © 2023 CMS Comunications Inc. all rights reserved. まとめ
copyright © 2023 CMS Comunications Inc. all rights reserved. まとめ
• メモリプロファイリングをやってみよう。 • コードによる違いを確認しよう。 • メモリ不足への対処に強くなろう。
copyright © 2023 CMS Comunications Inc. all rights reserved. ご清聴
ありがとうございました。
copyright © 2023 CMS Comunications Inc. all rights reserved. Q&A