ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

cv2.VideoCaptureで動画ファイルが開けない

詳しくはこれ

>>> cap = cv2.VideoCapture(file_path)
>>> print(cap.isOpened())  # False

色々ググってたけど、よくわからない・・・

stackoverflow.com

これみて( ゚д゚)ハッ!ってなった

せやった

$ pip install opencv-python

# 追加
$ pip install opencv-contrib-python

こいつがないと動かないんだった

www.slideshare.net

しかし、非公式やら非商用って書いてあってよくわからん。いつかまとめたい

「subword-nmt」を無理やりPythonから呼んで実行する

github.com

基本コマンド実行を想定されて組まれていますが、PythonでできているからPythonから叩けるんじゃね?って思ったので試したら結構難しい。。。

とりあえず試行錯誤のすえ、うまくいった感じのログだけ残す

qiita.com

from subword_nmt.learn_bpe import learn_bpe
import sys


input_data = """吾輩 わがはい は 猫 で ある 。 名前 は まだ 無い 。
どこ で 生れ た か とんと 見当 けん とう が つか ぬ 。 何 でも 薄暗い じめじめ し た 所 で ニャーニャー 泣い て いた事 だけ は 記憶 し て いる 。 吾輩 は ここ で 始め て 人間 という もの を 見 た """

sys.stdin = input_data.split('\n')
learn_bpe(infile=sys.stdin, outfile=sys.stdout, num_symbols=3000, min_frequency=2, verbose=True,  is_dict=False, total_symbols=False)

# 実行すると下記出力される
# #version: 0.2
# 吾 輩</w>
# ニ ャ

僕が試した結果が、qiita記事の結果と違うのはなぜかわからんが、とりあえずこれで動いたっぽさ。ただ、 sys.stdin を直接上書きしているので何が起こるかはわからない....

argparseのパラメータの補完をPythonスクリプトから行う

docs.python.org

便利です。通常こいつを利用する場合はコマンドから引数を指定して値をわたしますが、とある事情からプログラムからも指定したい場合どうやって渡すのかな?と調べてたらありました。

stackoverflow.com

へー。試してみる

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--dataset-dir', help='set dataset directory name',
...                         type=str, default=None, required=True)
_StoreAction(option_strings=['--dataset-dir'], dest='dataset_dir', nargs=None, const=None, default=None, type=<class 'str'>, choices=None, help='set dataset directory name', metavar=None)
>>>
>>> import sys
>>> sys.argv.extend(['--dataset-dir', '.'])
>>> parser.parse_args()
Namespace(dataset_dir='.')

naruhodo...

Kedroのチュートリアルが動かない

Kedro?なにそれ?おいしいの???

僕もはじめてさわるのでよくわかりません。

kedro.readthedocs.io

zenn.dev

よくわからないので、ドキュメントやらぐぐってでてきた記事を参考にチュートリアルしてたけど動かない。

$ kedro run
2020-11-24 12:23:27,840 - root - INFO - ** Kedro project get_started
Traceback (most recent call last):
  File "/opt/conda/lib/python3.7/site-packages/kedro/io/core.py", line 417, in parse_dataset_definition
    class_obj = next(obj for obj in trials if obj is not None)
StopIteration

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/conda/lib/python3.7/site-packages/kedro/io/core.py", line 149, in from_config
    config, load_version, save_version
  File "/opt/conda/lib/python3.7/site-packages/kedro/io/core.py", line 419, in parse_dataset_definition
    raise DataSetError("Class `{}` not found.".format(class_obj))
kedro.io.core.DataSetError: Class `pandas.CSVDataSet` not found.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/conda/bin/kedro", line 10, in <module>
    sys.exit(main())
  File "/opt/conda/lib/python3.7/site-packages/kedro/cli/cli.py", line 638, in main
    ("Project specific commands", project_groups),
  File "/opt/conda/lib/python3.7/site-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/opt/conda/lib/python3.7/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/opt/conda/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/opt/conda/lib/python3.7/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/opt/conda/lib/python3.7/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/app/get_started/kedro_cli.py", line 278, in run
    pipeline_name=pipeline,
  File "/opt/conda/lib/python3.7/site-packages/kedro/context/context.py", line 482, in run
    save_version=save_version, journal=journal, load_versions=load_versions
  File "/opt/conda/lib/python3.7/site-packages/kedro/context/context.py", line 245, in _get_catalog
    conf_catalog, conf_creds, save_version, journal, load_versions
  File "/opt/conda/lib/python3.7/site-packages/kedro/context/context.py", line 269, in _create_catalog
    load_versions=load_versions,
  File "/opt/conda/lib/python3.7/site-packages/kedro/io/data_catalog.py", line 300, in from_config
    ds_name, ds_config, load_versions.get(ds_name), save_version
  File "/opt/conda/lib/python3.7/site-packages/kedro/io/core.py", line 154, in from_config
    "for DataSet `{}`:\n{}".format(name, str(ex))
kedro.io.core.DataSetError: An exception occurred when parsing config for DataSet `example_iris_data`:
Class `pandas.CSVDataSet` not found.

エラーでググってみたけど、よくわからず。

意味わからんので、とりあえずインタラクティブモードで動くかなーとか思って確認しようとした。

$ python
Python 3.7.4 (default, Aug 13 2019, 20:35:49)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from kedro.io import DataCatalog
>>> from kedro.extras.datasets.pandas import (
...     CSVDataSet,
...     SQLTableDataSet,
...     SQLQueryDataSet,
...     ParquetDataSet,
... )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/conda/lib/python3.7/site-packages/kedro/extras/datasets/pandas/__init__.py", line 35, in <module>
    from .gbq_dataset import GBQTableDataSet  # NOQA
  File "/opt/conda/lib/python3.7/site-packages/kedro/extras/datasets/pandas/gbq_dataset.py", line 37, in <module>
    from google.cloud import bigquery
  File "/opt/conda/lib/python3.7/site-packages/google/cloud/bigquery/__init__.py", line 35, in <module>
    from google.cloud.bigquery.client import Client
  File "/opt/conda/lib/python3.7/site-packages/google/cloud/bigquery/client.py", line 57, in <module>
    from google.cloud.bigquery import _pandas_helpers
  File "/opt/conda/lib/python3.7/site-packages/google/cloud/bigquery/_pandas_helpers.py", line 25, in <module>
    from google.cloud import bigquery_storage_v1beta1
  File "/opt/conda/lib/python3.7/site-packages/google/cloud/bigquery_storage_v1beta1/__init__.py", line 25, in <module>
    from google.cloud.bigquery_storage_v1beta1 import types
  File "/opt/conda/lib/python3.7/site-packages/google/cloud/bigquery_storage_v1beta1/types.py", line 23, in <module>
    from google.cloud.bigquery_storage_v1beta1.proto import arrow_pb2
  File "/opt/conda/lib/python3.7/site-packages/google/cloud/bigquery_storage_v1beta1/proto/arrow_pb2.py", line 20, in <module>
    create_key=_descriptor._internal_create_key,
AttributeError: module 'google.protobuf.descriptor' has no attribute '_internal_create_key'
>>> from kedro.extras.datasets.pandas import CSVDataSet
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/conda/lib/python3.7/site-packages/kedro/extras/datasets/pandas/__init__.py", line 35, in <module>
    from .gbq_dataset import GBQTableDataSet  # NOQA
  File "/opt/conda/lib/python3.7/site-packages/kedro/extras/datasets/pandas/gbq_dataset.py", line 37, in <module>
    from google.cloud import bigquery
  File "/opt/conda/lib/python3.7/site-packages/google/cloud/bigquery/__init__.py", line 35, in <module>
    from google.cloud.bigquery.client import Client
  File "/opt/conda/lib/python3.7/site-packages/google/cloud/bigquery/client.py", line 57, in <module>
    from google.cloud.bigquery import _pandas_helpers
  File "/opt/conda/lib/python3.7/site-packages/google/cloud/bigquery/_pandas_helpers.py", line 25, in <module>
    from google.cloud import bigquery_storage_v1beta1
  File "/opt/conda/lib/python3.7/site-packages/google/cloud/bigquery_storage_v1beta1/__init__.py", line 25, in <module>
    from google.cloud.bigquery_storage_v1beta1 import types
  File "/opt/conda/lib/python3.7/site-packages/google/cloud/bigquery_storage_v1beta1/types.py", line 23, in <module>
    from google.cloud.bigquery_storage_v1beta1.proto import arrow_pb2
  File "/opt/conda/lib/python3.7/site-packages/google/cloud/bigquery_storage_v1beta1/proto/arrow_pb2.py", line 20, in <module>
    create_key=_descriptor._internal_create_key,
AttributeError: module 'google.protobuf.descriptor' has no attribute '_internal_create_key'
>>>

違うエラーがでてきた???はて???

ぐぐったら下記記事が

stackoverflow.com

試す

$ pip install --upgrade protobuf

もう一度試す

$ python
Python 3.7.4 (default, Aug 13 2019, 20:35:49)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from kedro.extras.datasets.pandas import CSVDataSet
>>> df = CSVDataSet(filepath="./data/01_raw/iris.csv"),
>>> df
(<kedro.extras.datasets.pandas.csv_dataset.CSVDataSet object at 0x7f791f4371d0>,)

はて?エラーはでなくなった

$ kedro run
2020-11-24 12:40:35,101 - root - INFO - ** Kedro project get_started
2020-11-24 12:40:35,337 - kedro.io.data_catalog - INFO - Loading data from `example_iris_data` (CSVDataSet)...
2020-11-24 12:40:35,347 - kedro.io.data_catalog - INFO - Loading data from `params:example_test_data_ratio` (MemoryDataSet)...
2020-11-24 12:40:35,350 - kedro.pipeline.node - INFO - Running node: split_data([example_iris_data,params:example_test_data_ratio]) -> [example_test_x,example_test_y,example_train_x,example_train_y]
2020-11-24 12:40:35,374 - kedro.io.data_catalog - INFO - Saving data to `example_train_x` (MemoryDataSet)...
2020-11-24 12:40:35,376 - kedro.io.data_catalog - INFO - Saving data to `example_train_y` (MemoryDataSet)...
2020-11-24 12:40:35,378 - kedro.io.data_catalog - INFO - Saving data to `example_test_x` (MemoryDataSet)...
2020-11-24 12:40:35,381 - kedro.io.data_catalog - INFO - Saving data to `example_test_y` (MemoryDataSet)...
2020-11-24 12:40:35,383 - kedro.runner.sequential_runner - INFO - Completed 1 out of 4 tasks
2020-11-24 12:40:35,386 - kedro.io.data_catalog - INFO - Loading data from `example_train_x` (MemoryDataSet)...
2020-11-24 12:40:35,388 - kedro.io.data_catalog - INFO - Loading data from `example_train_y` (MemoryDataSet)...
2020-11-24 12:40:35,391 - kedro.io.data_catalog - INFO - Loading data from `parameters` (MemoryDataSet)...
2020-11-24 12:40:35,393 - kedro.pipeline.node - INFO - Running node: train_model([example_train_x,example_train_y,parameters]) -> [example_model]
2020-11-24 12:40:36,164 - kedro.io.data_catalog - INFO - Saving data to `example_model` (MemoryDataSet)...
2020-11-24 12:40:36,169 - kedro.runner.sequential_runner - INFO - Completed 2 out of 4 tasks
2020-11-24 12:40:36,172 - kedro.io.data_catalog - INFO - Loading data from `example_model` (MemoryDataSet)...
2020-11-24 12:40:36,175 - kedro.io.data_catalog - INFO - Loading data from `example_test_x` (MemoryDataSet)...
2020-11-24 12:40:36,178 - kedro.pipeline.node - INFO - Running node: predict([example_model,example_test_x]) -> [example_predictions]
2020-11-24 12:40:36,197 - kedro.io.data_catalog - INFO - Saving data to `example_predictions` (MemoryDataSet)...
2020-11-24 12:40:36,200 - kedro.runner.sequential_runner - INFO - Completed 3 out of 4 tasks
2020-11-24 12:40:36,204 - kedro.io.data_catalog - INFO - Loading data from `example_predictions` (MemoryDataSet)...
2020-11-24 12:40:36,206 - kedro.io.data_catalog - INFO - Loading data from `example_test_y` (MemoryDataSet)...
2020-11-24 12:40:36,208 - kedro.pipeline.node - INFO - Running node: report_accuracy([example_predictions,example_test_y]) -> None
2020-11-24 12:40:36,210 - iris_test.pipelines.data_science.nodes - INFO - Model accuracy on test set: 96.67%
2020-11-24 12:40:36,213 - kedro.runner.sequential_runner - INFO - Completed 4 out of 4 tasks
2020-11-24 12:40:36,214 - kedro.runner.sequential_runner - INFO - Pipeline execution completed successfully.

こっちもうまくいった。なんだったんじゃ

embulkでs3→mysqlを試したときにlockがかかって死んだときのメモ

メモリ1GBという制限があり、タイトル通りの構成で転送したところ、ひたすら失敗することを確認したが、mysqlのログを確認してみるとどうやらlockされていたことがわかった。

qiita.com

ちなみに中々メモリ1GBで検証するのは大変だと思うので(クラウドならいけると思うけど)、Dockerでやりました。

ichirin2501.hatenablog.com

で、個人的にはlockがなんなのかちゃんと理解してないのですが、なんでこうなったのかを色々調べていると、どうやらembulkが複数スレッドを起動して書き込んでいることがわかった。弱小マシンだと複数スレッドで書き込まれると1つのクエリ遅延中にさらにinsertされてlockされて死ぬっぽい(ちゃんと理解してい(ry

じゃあ、複数起動しないようにすればええんじゃないかということでググってたらこんなtweet

そこから下記にたどり着き

qiita.com

結局ドキュメントをよみにいき

www.embulk.org

「Local executor plugin」なるものにたどり着きました。

で、embulk config.ymlの設定にexec: {max_threads: 1}を追加

in:
    type: s3
    # 省略...
out:
    type: mysql
    # 省略...
exec:
    max_threads: 1

いざかまくら!!!で実行したところ、数十分かかってやっとこさlockもされずout of memoryも発生せず無事msyqlへinsertすることができましたとさ

lockがよくわかっていないのでちゃんと勉強します。