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
5年分のツケを一気に払った話
Search
Soogie
September 26, 2024
Programming
3
1.7k
5年分のツケを一気に払った話
Talk at PyConJP2024, 2024/09/27
Soogie
September 26, 2024
Tweet
Share
More Decks by Soogie
See All by Soogie
PyHack#141今日やったこと
soogie
0
440
レビュー駆動学習のススメ_StaPy#83
soogie
0
550
職場にPythonistaを増やす方法
soogie
2
650
StaPyの効能
soogie
0
520
Stapy#25_LT
soogie
1
800
無料でできる,Cloud9上で開発してHerokuにデプロイする手順を共有します(再)
soogie
0
990
無料でできる、Cloud9上で開発してHerokuにデプロイする手順を共有します
soogie
2
1.9k
Develop on Cloud9 & Deploy to Heroku for FREE!!
soogie
0
100
Other Decks in Programming
See All in Programming
[Do iOS '24] Ship your app on a Friday...and enjoy your weekend!
polpielladev
0
110
A Journey of Contribution and Collaboration in Open Source
ivargrimstad
0
960
距離関数を極める! / SESSIONS 2024
gam0022
0
290
見せてあげますよ、「本物のLaravel批判」ってやつを。
77web
7
7.8k
CSC509 Lecture 09
javiergs
PRO
0
140
リアーキテクチャxDDD 1年間の取り組みと進化
hsawaji
1
220
タクシーアプリ『GO』のリアルタイムデータ分析基盤における機械学習サービスの活用
mot_techtalk
4
1.4k
OSSで起業してもうすぐ10年 / Open Source Conference 2024 Shimane
furukawayasuto
0
110
CSC509 Lecture 11
javiergs
PRO
0
180
Quine, Polyglot, 良いコード
qnighy
4
650
受け取る人から提供する人になるということ
little_rubyist
0
250
Outline View in SwiftUI
1024jp
1
330
Featured
See All Featured
Fireside Chat
paigeccino
34
3k
Speed Design
sergeychernyshev
25
620
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Designing for humans not robots
tammielis
250
25k
Faster Mobile Websites
deanohume
305
30k
Producing Creativity
orderedlist
PRO
341
39k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
4 Signs Your Business is Dying
shpigford
180
21k
Docker and Python
trallard
40
3.1k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
506
140k
Transcript
5 年 分 の ツ ケ を 一 気 に
払 っ た 話 Takeshi Sugiyama a.k.a. soogie(すーぎー) 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 1 https://x.gd/TOkaP
お 前 誰 よ ? • 事務系サラリーマン(1988~) • プログラミングは趣味&独学 BASIC(1977~)VBA(1995~)R(2014~)
※C,TurboPascalもちょっと • Python(2014~) みんなのPython勉強会(2015~) 何度か登壇、LT PyConJP2016、2018、2021登壇 Python Boot Camp TA × 5回 Python関連書籍の出版前レビュー× 20冊+ 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 2
ト ー ク内 容 話すこと • Python3.6→Python3.11での苦労話 • 3rdパーティパッケージのVer Upに伴う諸問題
話さないこと • 技術的負債をため込まない上手なやり方
背 景 • 現状問題なく動いているシステムをいじりますか? • PythonやパッケージがVer Upしただけで修正 しますか? • 非エンジニア組織で、他人が書いた現状問題なく
動いている業務アプリをいじる勇気ありますか? 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 4
た ま っ て い く ツ ケ 5 年
分 の ツ ケ を 一 気 に 払 っ た 話 5 Pythonは毎年新しいバージョンがリリースされていく サードパーティパッケージも日々バージョンが上がっていく たまに機能追加しようとするとネットで調べたコードがPython3.6では動かない
た ま っ て い く ツ ケ 5 年
分 の ツ ケ を 一 気 に 払 っ た 話 6 Pythonは毎年新しいバージョンがリリースされていく サードパーティパッケージも日々バージョンが上がっていく たまに機能追加しようとするとネットで調べたコードがPython3.6では動かない 仕事はアプリのメンテではなくアプリを使うこと 気にはなるけど、新しい機能を使わなければ困らない
何もしない人には過失はない。しかし何もしないことほど 大きな過失が人生にあろうとは思えない。 下村湖人(教育家・小説家、1873ー1930) “ ” 5 年 分 の ツ
ケ を 一 気 に 払 っ た 話 7
業 務 系 機 械 学 習 We b ア
プ リ 「 X 」 ( 仮 名 ) 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 8 • 5年前に開発され、4年前に引き継ぎ • 「ドキュメントなし」「テストコードなし」「書いた本人たちは退職・異動」の3重苦 • ドキュメントを作った話はPyConJP2021のアーカイブをご覧ください • その後テストも書いたし後輩にソースコードレベルでレクチャもしてきた
X ( 仮 名 ) の 仕 組 み 5
年 分 の ツ ケ を 一 気 に 払 っ た 話 9
発 生 し た 5 つ の 問 題 5
年 分 の ツ ケ を 一 気 に 払 っ た 話 10 ホントはもっといろいろあったけど今日は割愛
問 題 1 : フ ァ イ ル ア ッ
プ ロ ー ド で 落 ち る 現象:学習用データをアップロードしようとすると落ちる 発生個所:pandas.DataFrame.to_dict(orient="record") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 11
問 題 1 : フ ァ イ ル ア ッ
プ ロ ー ド で 落 ち る 現象:学習用データをアップロードしようとすると落ちる 発生個所:pandas.DataFrame.to_dict(orient="record") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 12
問 題 1 : フ ァ イ ル ア ッ
プ ロ ー ド で 落 ち る 現象:学習用データをアップロードしようとすると落ちる 発生個所:pandas.DataFrame.to_dict(orient="record") ポイント:正しくは「"records"」 。単なるtypoだけどなぜ今まで動いていた? ソースコードを読む 対応:typoを修正 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 13 【pandas1.4】 pandas.core.frame.py elif orient.startswith("r"): orient = "records" 【 pandas2.2 】 pandas.core.methods.to_dict.py orient = orient.lower()
問 題 2 : 機 械 学 習 で 落
ち る 現象:ロジスティック回帰でLASSOを使うと落ちる(他いろいろ) 発生個所:sklearn.linear_model.LogisticRegression(penalty="l1") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 14
問 題 2 : 機 械 学 習 で 落
ち る 現象:ロジスティック回帰でLASSOを使うと落ちる(他いろいろ) 発生個所:sklearn.linear_model.LogisticRegression(penalty="l1") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 15
問 題 2 : 機 械 学 習 で 落
ち る 現象:ロジスティック回帰でLASSOを使うと落ちる(他いろいろ) 発生個所:sklearn.linear_model.LogisticRegression(penalty="l1") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 16
問 題 2 : 機 械 学 習 で 落
ち る 現象:ロジスティック回帰でLASSOを使うと落ちる(他いろいろ) 発生個所:sklearn.linear_model.LogisticRegression(penalty="l1") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 17
問 題 2 : 機 械 学 習 で 落
ち る 現象:ロジスティック回帰でLASSOを使うと落ちる(他いろいろ) 発生個所:sklearn.linear_model.LogisticRegression(penalty="l1") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 18
問 題 2 : 機 械 学 習 で 落
ち る 現象:ロジスティック回帰でLASSOを使うと落ちる(他いろいろ) 発生個所:sklearn.linear_model.LogisticRegression(penalty="l1") ポイント:LogisticRegressionのsolverパラメータのデフォルト値が"liblinear"から 0.22以降はL1ペナルティに対応していない"lbfgs"に変わった 公式ドキュメントを読む 対応:solver='liblinear'を明示的に追加 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 19
問 題 3 : 結 果 を 格 納 す
る と き に 落 ち る 現象:機械学習後にMongoDBに結果が保存されず落ちる 発生個所:pymongo.collection.save() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 20
問 題 3 : 結 果 を 格 納 す
る と き に 落 ち る 現象:機械学習後にMongoDBに結果が保存されず落ちる 発生個所:pymongo.collection.save() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 21
問 題 3 : 結 果 を 格 納 す
る と き に 落 ち る 現象:機械学習後にMongoDBに結果が保存されず落ちる 発生個所:pymongo.collection.save() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 22
問 題 3 : 結 果 を 格 納 す
る と き に 落 ち る 現象:機械学習後にMongoDBに結果が保存されず落ちる 発生個所:pymongo.collection.save() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 23
問 題 3 : 結 果 を 格 納 す
る と き に 落 ち る 現象:機械学習後にMongoDBに結果が保存されず落ちる 発生個所:pymongo.collection.save() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 24
問 題 3 : 結 果 を 格 納 す
る と き に 落 ち る 現象:機械学習後にMongoDBに結果が保存されず落ちる 発生個所:pymongo.collection.save() ポイント:MongoDB4.2以降はdb.collection.save()というAPIがなくなった 公式ドキュメントの変遷を現行のVer7からさかのぼる MongoDB4.1まで:save()だけで新規か更新かはいい感じに判断 MongoDB4.2以降:新規なのか更新なのか明示的に指定が必要 対応:やりたい内容に応じてinsert_one()とreplace_one()を使い分け 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 25
問 題 4 : B o r u t a
オ プ シ ョ ン で 落 ち る 現象:特徴量選択手法でBorutaをオプション指定すると落ちる 発生個所:boruta.BorutaPy() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 26
問 題 4 : B o r u t a
オ プ シ ョ ン で 落 ち る 現象:特徴量選択手法でBorutaをオプション指定すると落ちる 発生個所:boruta.BorutaPy() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 27
問 題 4 : B o r u t a
オ プ シ ョ ン で 落 ち る 現象:特徴量選択手法でBorutaをオプション指定すると落ちる 発生個所:boruta.BorutaPy() ..../site_packages/boruta/boruta_py.py 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 28
問 題 4 : B o r u t a
オ プ シ ョ ン で 落 ち る 現象:特徴量選択手法でBorutaをオプション指定すると落ちる 発生個所:boruta.BorutaPy() ポイント:borutaがNumPy1.20で廃止されたnp.int等を使っている PyPI上は2019年のVer0.3のまま。作者のGitHubではパッチが当たっている ※2024/8/14にPyPI上のborutaが0.4.3になり今は解消&scikit-learn1.5.1に包含 対応:boruta_py.pyにパッチ当て(np.を取る) 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 29
問 題 5 : 作 成 済 み モ デ
ル を 呼 び 出 す と 落 ち る 現象:旧バージョンで作成したモデルを呼び出すと落ちる 発生個所:pandas.read_pickle() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 30
問 題 5 : 作 成 済 み モ デ
ル を 呼 び 出 す と 落 ち る 現象:旧バージョンで作成したモデルを呼び出すと落ちる 発生個所:pandas.read_pickle() ポイント:モデルはscikit-learnのオブジェクト。scikit-learnのバージョン違いにより オブジェクトの内部構造(メソッドやプロパティ)が変わり 古いバージョンのオブジェクトのpickleを新バージョンで読み込むことができない 対応:プログラム的には打つ手なし。どうする? 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 31
3 つ の 対 応 案 5 年 分 の
ツ ケ を 一 気 に 払 っ た 話 32 新 旧 工数大 工数小 問題を先送りし ツケをため込み続ける
3 つ の 対 応 案 5 年 分 の
ツ ケ を 一 気 に 払 っ た 話 33 新 旧 工数大 工数小 問題を先送りし ツケをため込み続ける 5年分の作成済みモデ ルを新バージョンですべて 作り直して再保存
3 つ の 対 応 案 5 年 分 の
ツ ケ を 一 気 に 払 っ た 話 34 新 旧 工数大 工数小 旧バージョンで作成した モデルを読み込めないこ とを許容 問題を先送りし ツケをため込み続ける 5年分の作成済みモデ ルを新バージョンですべて 作り直して再保存
対 応 方 針 決 定 5 年 分 の
ツ ケ を 一 気 に 払 っ た 話 35 新 旧 工数大 工数小 旧バージョンで作成した モデルを読み込めないこ とを許容 万一に備えたX Classic X Classic
め で た し 、め で た し ⚫ いろいろあったけど、X(仮名)は新しい環境でリリース完了
⚫ 5年分のツケを一気に清算して(一部踏み倒したけど)めでたし、めでたし 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 36
め で た し 、め で た し ? ⚫
いろいろあったけど、X(仮名)は新しい環境でリリース完了 ⚫ 5年分のツケを一気に清算して(一部踏み倒したけど)めでたし、めでたし ⚫ 2024年5月、scikit-learn1.5(boruta0.4.3含む)リリース ⚫ 2024年6月、NumPyが18年ぶりのメジャーアップデートで2.0に ⚫ MicrosoftからTeamsのincoming webhook機能廃止の告知 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 37
ま と め 5 年 分 の ツ ケ を
一 気 に 払 っ た 話 38 一番の教訓は「ツケはため込まないのが一番」 ドキュメント、テストの整備は前提 常に最新化といかないまでも大きなバージョンアップの際 には新しいバージョンでの動作確認はしておきたい (NumPy2.0とか) レガシーコード化させないためのテストコードの書き方は 午後にいいトークがあります
Enjoy! Enjoy!