DaggerでPythonのCIを実装してGitHub Actionsで動かしてみる

今回の投稿では、ポータブルなCI/CDワークフローとして注目されている Dagger について紹介します。 例として、簡単なPythonアプリケーションのCI/CDをDaggerで実装してみました。 フォーマットチェック (black) 、静的チェック (flake8) 、テスト (pytest) …

MoT TechTalkでサーバサイドアプリケーションのRust活用について話しました

11/8に開催されたMoT TechTalk #8にて、AWS上で稼働するサーバサイドアプリケーションの1つをRust言語へリプレースした話をしました。 jtx.connpass.com サーバサイドアプリケーションの他にも、RustでのエッジアプリケーションやCI/CDについてもがっちりカ…

Kubernetesのコントローラの仕組みとカスタムコントローラの作り方

会社合同の勉強会で、前々からやろうやろうと思ってなおざりになっていた、Kubernetesのコントローラについて調べて発表しました。 資料はこちらです。 speakerdeck.com 最後のページに記載しているこちらの参考文献が大変勉強になりました。 https://www.sl…

RustのLT会 Shinjuku.rs #13 の参加メモ

FORCIAさん主催のオンライン勉強会 RustのLT会 Shinjuku.rs #13 に参加してきました。オンライン開催です。 forcia.connpass.com LT#1: RustでPostgresの拡張を書く ( @matsu7875 さん) 発表資料は https://speakerdeck.com/matsu7874/write-postgres-extens…

Python: tenacityでリトライを実装する

信頼できない環境で稼働するアプリケーションには、リトライ処理が不可欠です。 難しくはないので自前で実装してしまうのですが、特定の例外のみリトライしたい・リトライ間隔を指数関数的に増やしたい・リトライ時はログ出力したいなどの細かなリクエストを…

11/6 機械学習基盤 本番適用と運用の事例・知見共有会で実験環境について話しました

機械学習工学研究会 本番適用のためのインフラと運用WGが主催するカンファレンスにて、最近のお仕事について発表しました。 mlxse.connpass.com 資料はこちらです。 speakerdeck.com

diveでDockerイメージのファイルを調査する

お仕事にてDocker (Pythonアプリケーション) のイメージサイズの削減に挑戦する機会がありました。その調査で用いた dive について紹介します。 diveとは diveを使った調査 diveとは diveはイメージやレイヤのコンテンツ (ファイル) を可視化するためのツー…

Python: pre-commitでコミット前にチェックする

Pythonで安全にコーディングしようとすると、リンタ (ex. flake8) やフォーマッタ (ex. black) 、型チェッカ (ex. mypy) など、コミット前に実行するコマンドが増えていきます。 今回は、コミット時にコマンドを自動的にフックするPythonのツールとしてpre-c…

mypyで静的型チェックを導入する

仕事で既存のコードへmypyの導入を試みる機会がありましたので、使い方とtipsの備忘録としてまとめます。 mypyとは インストール 型チェックの実行 Tips: 型チェック対象を限定する 設定 Tips: スタブが無いパッケージのエラーは無視させる コードの修正 Tip…

AWS CodeBuildでDockerビルドしてECRへプッシュする

AWS

以前AWS CodeBuildでPythonアプリケーションをビルドしてS3へアップロードする方法を紹介しました。 AWS CodeBuildでGitHubと連携してPythonアプリをビルドする - け日記 今回はDockerイメージをビルドして、ECRにプッシュする方法について見ていきたいと思…

sqlparseを使って簡単にSQLをパースする

大量のSQLのリストやログから特定テーブルへのUPDATEを行うクエリだけを抽出したいといったケースが、しばしばあります。1つのアプリケーションからアクセスされるDBであればコードを追っていくことでどうにかなるのですが、異なる言語やORMで構成された複数…

panderaでDataFrameをバリデーションする

pandasのDataFrameは柔軟なテーブル構造を提供してくれますが、時に柔軟すぎて困ることもしばしばです。本番運用するアプリケーションですとなおさらこの欠点が目立ちます。 入力データに依存して意図しない型に変わってしまったり... ex. [1, 2, 3]だとint6…

MySQL: カラムをちょっと変えてテーブルをコピーしたい

SQL

テーブルのレコードをコピーしたい、だけどちょっとカラムの定義や値を変えたいケースがあります。 例として、以下の要件を満たしつつ、postsからcopied_postsへコピーしたいとします。 コピーした日時 (copied_at) を追加したい emailをNULLにしたい mysql>…

Kubeflow Pipelines SDKを用いた並列処理の実装

最近はお仕事でKubeflow Pipelinesを触り始めています。 PythonでDAGを定義し、SDK (KFP) を使ってArgo Workflowのマニフェストを出力して、それをKubeflowにアップロードしてパイプラインを作る、という流れで開発しています。 サンプルパイプライン proces…

論文メモ: An intriguing failing of convolutional neural networks and the CoordConv solution

畳み込みニューラルネットワークが持つ座標変換の問題に着目してCoordConvを提案したAn intriguing failing of convolutional neural networks and the CoordConv solution (NeurIPS'18, arXiv) について紹介します。 @incollection{NIPS2018_8169, title = …

Python: Parquetフォーマットファイルを入出力する (Pandasとpyarrow)

今回はテーブルデータをParquetファイルで扱う方法について2つ紹介します。 Apache Parquet サポートされるデータ型 Pandas DataFrameを用いたParquetファイルの変換 Apache Arrow pyarrowを用いたParquetファイルの変換 まとめ コードは以下の環境で動作確…

Python: poetryでパッケージの依存管理

私はこれまでPythonのパッケージ管理として pyenv + pipenv を主に使ってきました。が、最近はpipenvは色々あって使いづらさを感じていました。 pipenv lockやpipenv syncが遅い (気がする) pipenv自体の更新が怪しかった (参考、今年に入って4月と6月にリリ…

Python: 安全・手軽に一時ファイル・一時ディレクトリを作る (tempfile)

一時的に使うファイルやディレクトリを作成して、処理が終わったら削除する、という手続きを実装する機会はしばしばあると思います。 簡単なことではあるのですが、処理の例外ハンドラで削除の実装を忘れてゴミファイルができてしまったり、並列実行したとき…

論文メモ: LUVLi Face Alignment: Estimating Landmarks’ Location, Uncertainty, and Visibility Likelihood

先週に引き続き顔ランドマーク推定に関わる論文として、CVPR2020で提案された LUVLi Face Alignment: Estimating Landmarks’ Location, Uncertainty, and Visibility Likelihood (arXiv) を紹介します。 LUVLi Face Alignment: Estimating Landmarks’ Locati…

論文メモ: Adaptive Wing Loss for Robust Face Alignment via Heatmap Regression

今回は顔ランドマーク推定に関係する論文を取り上げます。 Adaptive Wing Loss for Robust Face Alignment via Heatmap Regression ヒートマップ回帰 損失関数にMSEを用いた場合の問題点 提案 Adaptive Wing Loss Weighted loss mapで前景画素を強調 実験 考…

複数の画像を組み合わせるオーグメンテーション (mixup, CutMix)

CV

複数の画像を組み合わせたオーグメンテーションであるmixupとCutMixについてまとめます。 mixup CutMix mixup 2枚の画像をラベルともどもブレンドするのがmixup1です。次に紹介するCutMixの論文の図がわかりやすいです。 [2] Table 1 抜粋 入力 と を重みλで…

Optunaでハイパパラメータチューニング

今回はハイパパラメータチューニングを自動化するOptunaを触りながら紹介していきます。 Optuna BayesianOptimizationのかゆいところ Optunaを用いた実装 1変数関数の最適化 分散最適化 scikit-learnの最適化 まとめ Optuna 勾配ブースティング木やニューラ…

画像の一部をマスクするオーグメンテーションのまとめ (Random Erasing, Cutout, Hide-and-Seek, GridMask)

CV

画像の一部をマスクすることでオーグメンテーションする手法について代表的なものをまとめました。 そもそも: なぜ画像の一部をマスクするのか? Random erasing Cutout Hide-and-Seek GridMask まとめ そもそも: なぜ画像の一部をマスクするのか? オーグメ…

物体検出で重なったバウンディングボックスを除去・集約するアルゴリズムのまとめ (NMS, Soft-NMS, NMW, WBF)

物体検出の分野では、検出した物体をバウンディングボックス (BBox) で囲んで、それぞれに信頼度 (スコア) を算出します。 このとき重複したBBoxを除去あるいは集約するアルゴリズムにはバリエーションがあります。物体検出モデルの後処理やコンペなどでよく…

Amazon EMRのステップを使ってPySparkバッチアプリケーションを実装する

前回に引き続きEMRについてです。今回はEMRのステップを用いてPySparkのバッチアプリケーションを実装していきます。 ohke.hateblo.jp EMRのステップ 前回は、JupyterノートブックからSpark環境へジョブをリクエストしていました。これは分析やモデリングの…

Amazon EMRでSparkクラスタを作ってSageMakerからジョブを実行する

Jupyter Notebookなどで作業中に、メモリに乗り切らないような大量のデータに対して何らか処理が必要になるケースがしばしばあります。 これを解決するツールの一つとしてAmazon EMRをきちんと知っておきたいというモチベーションで、今回はAmazon EMRでSpar…

rust-ndarrayを使った行列演算

Rustの行列演算ライブラリ rust-ndarray についての紹介です。ほとんどが備忘録的なコード例となります。 rust-ndarray Rustの行列演算ライブラリはいくつかあります。rust-ndarrayもその1つで、概ねプリミティブな行列演算のみをサポートしたものです。 git…

論文メモ: High-Resolution Representations for Labeling Pixels and Regions

姿勢推定の分野でブレイクスルーとなったHRNetを、顔ランドマーク推定タスクなどに適用した High-Resolution Representations for Labeling Pixels and Regions (arXiv) についてのメモです。 @misc{sun2019highresolution, title={High-Resolution Represen…

Python: HDF5ファイルの作成と読み込み (h5py)

お仕事で触れる機会が増えてきたHDF5について調べて整理します。また、h5pyを使ってWFLWデータセットをHDF5へ変換してみました。 HDF5 HDF (Hierarchical Data Format) は大量のデータを格納するファイルフォーマットで、The HDF Groupによって開発・メンテ…

AWS Service Brokerを使ってKubernetesでマネージドサービスを管理する

EKSのおかげでEC2・ASG・ELBなどが一式揃ったKubernetes環境を楽に構築できるようになりました。 一方で、上記以外のAWSマネージドサービスに依存したアプリケーションの場合、それらマネージドサービスもKubernetes (つまりマニフェストファイル) の管理下…