ひよこ、通勤中。

通勤中の電車の中でひよこは何を思うのか。

urlからとってきた画像をjupyterに表示する

import io
import urllib
import matplotlib.pyplot as plt
from PIL import Image

def display_images(urls):
    plt.figure()

    for i, url in enumerate(urls):
        plt.subplot(1, 5, i+1) # 適宜表示したい数にあわせて調整
        image = Image.open(io.BytesIO(requests.get(cdn_format.format(url).content))
        plt.imshow(image)

rect(top, left, bottom, right)からIoU計算する

IoUとは: Intersection over Union (IoU) for object detection - PyImageSearch

import numpy as np
from sklearn.metrics import jaccard_score

N = 100 # 精度
# rect:  top, left, bottom, right (0~1, float)
def rect_to_array(rect):
    top, left, bottom, right = (np.array(rect) * N).astype(int)
    box = np.pad(np.ones((bottom - top, right - left)), ((top, N - bottom), (left, N - right)))
    return box

def iou(true, pred):
    true_array = rect_to_array(true)
    pred_array = rect_to_array(pred)
    return jaccard_score(true_array.flatten(), pred_array.flatten())

print (iou((0.5,0.5,1,1), (0,0, 0.8, 0.8)))
# 0.1125

saved_modelのグラフの中身がどうなってるかを確認する

1. ログにグラフ情報を書き出す

import tensorflow as tf
log_dir = "/tmp/tf-log/"

graph = tf.Graph()
with tf.Session(graph=graph) as session:
    loaded = tf.saved_model.load(
        session,
        {'serve'},
        ここにsaved_modelのpath
    )
    
    train_writer = tf.summary.FileWriter(log_dir)
    train_writer.add_graph(session.graph)

2. tensorboardで見る

tensorboard --logdir /tmp/tf-log


追記(2020/05/04): netronつかったらguiでグラフ構造確認できるわ...
github.com

Docker/kubernetes関連本メモ

これ読みながらのメモ

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門

alias:

  • k: kubectl

Dockerコンテナのdeploy

  • --nameは本番環境では使わない -docker image prune
    • 現時点で使ってないimageの削除
  • docker container stats [container id]
    • container を top する

docker-compose

  • --build option で毎回ビルド
  • volumes
    • local:dest
  • container-name で名前つけれる

実用的なコンテナ構築とデプロイ

  • データはData Volumeコンテナに持たせる
  • busybox
    • data volumeとかに使われる最小限の軽量OS
  • --volume-from [volume container name]
    • volumeが共有される

local(Docker for Mac)でkubenetes

  1. kubenetesのpreferenceからkubenetesを起動
  2. kubectxコマンドで確認するとdocker-for-desktop というクラスタができている

training

  • k proxy でpodたちと通信できるproxyが立ち上がる
  • k exec -it POD COMMAND -c CONTAINER で実行中のコンテナに入る

deploy

  • k rollout history deploy DEPLOY でdeployのhistoryが見えれる。(--recordつけてapplyしたdeploymentの)
  • k rollout history deployment DEPLOYでrollback

service (svc)

  • cluster内のserviceは Service名.Namespace名.svc.local で名前解決できる
  • ClusterIP Service(default): 内部IPアドレスにserviceを公開できる
  • NodePort Service: 各ノード上からServiceポートに接続するためのglobalなportを空ける
  • LoadBalancer Service: クラウドで提供されているロードバランサと連携する
  • ExternalName Service: kuberenetesから外部ホストを解決するためのえい

いつも使うkubectlのコマンド

切り替え

  • 使ったことあるクラスタ一覧: kubectx
  • クラスタ切り替えkubectx <NAME>

  • 使ったことあるnamespace: kubens

  • namespace切り替え: kubens <NAME>

brew install kubectxでkubectxとkubensが入る (ahmetb/kubectx: Fast way to switch between clusters and namespaces in kubectl)

よく使うやつ

  • pod一覧 k get pods --sort-by=.metadata.creationTimestamp

alias: kubectl -> k

関数の引数を固定した関数を作る

functools.partialを使うと引数を固定した関数を作ることができる。

例えば以下のような引数を2つ受け取る関数args2を、functools.partialを使って1つ目の引数aを固定したargs1を作ると以下のような感じに使える。

import functools

def args2(a, b):
    print(f"a:{a} b:{b}")

args1 = functools.partial(args2, 'a')
args1('b')
# a:a b:b