Python で zip関数を使う際に、2つの配列が同じ大きさを想定する場合は 3.10 から導入された strict=True を使おう

Python で2つの配列を for 文で扱いたい場合によく使うのが zip() です。 zip()を使った for 文では暗黙的に同じ大きさが要求されると思っていたが、実際には以下のように2つの配列の大きさが異なっていてもエラーが出ないことに気が付かず、困ったことがあった。 1 2 3 4 5 6 7 8 9 10 In [1]: a = [1,2,3,4] In [2]: b = [1,2,3] In [3]: for i,j in zip(a,b): ...: print(i,j) ...: 1 1 2 2 3 3 てっきり、大きい配列の要素を参照時にエラーが発生するかと思ったら、そんなことはなかった。 assert とかで事前にコケるようにしておくとか必要そう。 もしくは、両者の配列のサイズが同じことを明示的に確認するのが吉。 また蛇足だが、Stackoverflow では意図的に異なる大きさの配列を上手く循環させつつ回したい場合の対処法も書いてあり勉強になった。1 2022-10-27: 追記 @ftnext さんから以下の情報2を教えてもらいました。 小さい方を読み切ったら for を抜けるの予想と違いますよね。 3.10 から zip に strict 引数が追加されており、True を指定すれば長さが異なると ValueError を送出するようになったんです! https://docs....

October 17, 2022 · Shunya Ueta
Airflow で環境変数をJSONファイルとしてお手軽に書き出す方法

Airflow 1系で設定されている環境変数を JSON ファイルとしてGUIを使って書き出す方法

CloudComposer(GCP の Airflow のマネージドサービス)で運用している Airflow 1 系上で設定されている環境変数を JSON ファイルとして書き出したかったが、つまずいたのでメモを公開しておく。 Airflow の運用の理想としては、リポジトリをベースに CI 経由で CloudComposer を構築していくのがベスト。 だが、Airflow では GUI でお手軽に環境変数(Airflow では Variables という概念1)が設定でき、便利な半面、デメリットとしてリポジトリをベースにした Single Source of Truth の状態が保てなくなってしまう。 Airflow の環境変数を JSON ファイルとして書き出す方法 上部の Admin メニューから、Variablesをクリックしてページに移動 With selectedボタンをクリックすると Exportボタンがドロップダウンリスト内にでてくるので、これをクリックすれば Airflow に保存されている環境変数を JSON ファイルとして書き出せる Export できるとは初見でわからなかったのでこの UI を考えた人は罪深い。@naoさんに教えていただけて感謝! Airflow CLI からでも環境変数を JSON ファイルとして出力できるらしい2が、手元から 1 gcloud composer environments run COMPOSER_NAME --location asia-northeast1 variables -- --export env.json を実行してもローカルには保存されなかったので、実行結果は CloudComposer 内部のインスタンスに保存されている模様。...

October 4, 2022 · Shunya Ueta

Meta が公開したデータ処理の効率化・高速化を狙うエンジン Velox が面白そう

日課の RSS フィードを眺めていると、クエリエンジンやデータ処理の最適化のための高速化ライブラリが Meta が OSS として公開した1 のを知った。 Velox のリポジトリはこちら facebookincubator/velox: A C++ vectorized database acceleration library aimed to optimizing query engines and data processing systems. 実際にリポジトリを観てみると C++で書かれており、たしかにパフォーマンスが高いのが納得。 ドキュメントやチュートリアルなどはこちらのサイトで用意されています。 Hello from Velox | Velox Meta 社内では、Presto や Spark に適用して処理の高速化、PyTorch に活用して前処理や特徴量エンジニアリングの高速化が進められているらしいです。 技術ブログ記事 1が何をやっているか明瞭なので、かいつまんでメモを残しておきます。 SQL の分析、ストリーミング処理や機械学習のためのデータ処理など実際の処理内容は似通っているが、様々なフレームワークが使われ、独立して進化している。 この断片化によって、保守と拡張が困難になっていたが、それらを統合する形で実行可能にするのが Verox Presto, Spark などのデータ処理エンジンは、一見異なるように見えるが、レイヤー構造で考えると非常に似通っている。 Verox は一般的に実行エンジンレイヤーの代わりとなり、式評価、集約、ソート、結合などの処理を提供する。(一般的に data plane と呼ばれる) 実例と結果 Presto は Java で実行されるが、それを C++の Velox で置き換えた。Prestissimo というプロジェクト名で進んだ。(カッコいいね) Java での実行と比べると、大体 6 倍ほど高速化された Spark 上では、Gluten とよばれるプロジェクトで Velox と同じように C++での実行を試みるプロジェクトが公開されている。 PyTorch の TorchArrowを Velox 上で実行可能 最終的には、Velox で従来のデータマネジメントの部分と機械学習インフラストラクチャの部分の垣根を統一することを狙っている。...

September 1, 2022 · Shunya Ueta

Java の memory map を理解する

Apache Lucene のインデックスの取り扱いについて勉強していたら、 Java の memory map について言及されていたが、Jave の memory map1 について日本語で分かりやすく解説されている記事がなかったので、勉強がてらまとめた。 メモリマップ自体の説明はこちらのサイトが非常にわかりやすかった2 mmap はファイルとメモリーアドレスのマッピングを行う つまり、ファイルをメモリ上にマップ(射影)してメモリ上でファイルを扱えるようにするということですね。 Apache Lucene の使用例だと、Lucene の検索用のインデックスファイルを MMap でメモリ上にマップして扱えるようにしていそう。 参考にしたのは上記2つの記事がわかりやすい記事だった。 Java プログラムに関連するメモリは 4 部分から構成される3 Stack: メソッドが呼ばれた際に、Stack はメソッドを完了させるためのメモリ空間を提供する。この空間はパラメータやローカル変数、現在のオブジェクトへの参照などが格納されている。Frame はメモリ空間を参照し、メソッドの呼び出しをサポートする。Stack は LIFO(Last in First out)方式で動作し、呼び出し基のメソッドの Stack frame を削除するために最後の Stack frame(現在実行中のメソッド) を削除する必要がある。 Heap: Java で作成されるオブジェクトは全て Heap で作成される。 Static Area: プログラムの実行中に存在する値を格納するメモリを参照する。静的な変数を宣言した際に、この領域に存在する。 Code: 実行されるコードが格納される場所。 中でも Java の Memory mapped file は、メモリから直接ファイルにアクセスするのに役立つ Java の特殊ファイル4。 Java は、java.nio パッケージで Memory mapped file をサポートしている。 Memory mapped I/O は、ファイル システムを使用して、ユーザーから直接ファイルシステムページへの仮想メモリマッピング(virtual memory mapping)を確立する。Memory mapped file は単純に大きな配列として扱うことができ、Memory mapped file に使用されるメモリーは、Java の Heap 空間外部が利用される。...

August 22, 2022 · Shunya Ueta

Apache Beam 2.40 で導入された scikit-lean, Pytorch の効率的な推論が可能になる RunInference API を試してみる

2022-07-21 に Google Cloud が Cloud DataFlow の新機能として、DataFlow ML という新機能を発表した。1 Dataflow ML - Speaking of ML transforms, Dataflow now has added out of the box support for running PyTorch and scikit-learn models directly within the pipeline. The new RunInference transform enables simplicity by allowing models to be used in production pipelines with very little code. These features are in addition to Dataflow’s existing ML capabilities such as GPU support and the pre and post processing system for ML training, either directly or via frameworks such as Tensorflow Extended (TFX)....

August 18, 2022 · Shunya Ueta