はい メモです

メモ代わり

SSN RunCommandを利用するLambdaのスクリプト

import json
import boto3
import time

instance = [{instanceID}]
ssm = boto3.client('ssm')


def lambda_handler(event, context):
    # TODO implement
    ##time.sleep(6)    
    ssm.send_command(
        InstanceIds = instance,
        DocumentName = "AWS-RunPowerShellScript",
        Parameters = {
            "commands": [
                "C:/Users/Administrator/Desktop/touch.bat", 
            ],
            "executionTimeout": ["3600"]
        },
    )
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

nvidia-smiについて調べた

目次

NVIDIA-SMIについて

NVIDIA公式

developer.nvidia.com (取得できるメトリクスは公式ペーシの画像の通り)

要約

nvidia-smiコマンドについて

NVIDIA公式のPDF

http://developer.download.nvidia.com/compute/DCGM/docs/nvidia-smi-367.38.pdf

抜粋翻訳

SYNOPSIS

nvidia-smi [OPTION1 [ARG1]] [OPTION2 [ARG2]] ...

DESCRIPTION
nvidia-smi(同じくNVSMI)は、Fermi以上のアーキテクチャファミリのNVIDIAのTesla、Quadro、GRID、およびGeForceバイスに監視および管理機能を提供します。 GeForce Titanシリーズのデバイスはほとんどの機能をサポートされていますが、残りのGeforceブランドには非常に限られた情報しかありません。 NVSMIは、Windows Server 2008 R2以降の64ビットバージョンのWindowsと同様に、すべての標準NVIDIAドライバサポートLinuxディストリビューションをサポートするクロスプラットフォームツールです。メトリックは、標準出力を介してユーザーが直接使用することも、スクリプト目的でCSVおよびXML形式を介してファイルによって提供することもできます。 NVSMIの機能の多くは、基礎となるNVML Cベースのライブラリによって提供されています。 NVMLの詳細については、下記のNVIDIA開発者Webサイトのリンクを参照してください。 NVMLベースのPythonバインディングも利用可能です。 NVSMIの出力は後方互換性があるとは限りません。ただし、NVMLとPythonバインディングはどちらも下位互換性があるため、NVIDIAドライバのリリース間で維持する必要があるツールを作成するときには、最初の選択肢となるはずです

コマンド一部抜粋

option description
-h ヘルプ表示
-L 接続されたGPUリストの表示
-u, --unit ディスプレイ機器情報を表示。Tesla Sクラスのみ利用可
-i, --id=ID 特定のGPUの情報を表示。IDは0以上の自然数で表されるGPUインデックス(GPUボードのシリアル番号、UUID、PCIバスIDなど)。
-f FILE, --filename==FILE 出力を標準出力ではなくファイル出力する。指定ファイルは上書き。
-x, --xml-format XMLフォーマットで出力する。
--dtd -xと一緒に使用し、XML出力をDTDにする

Nvidia-ml-py

nvidia-smiのpythonバインド

公式ページ

メトリクス

ml-py 項目
nvml.util.gpu GPUの使用率
nvml.util.memory メモリの使用率
nvml.mem.total トータルメモリ
nvml.mem.used 使用中メモリ
nvml.mem.free 空きメモリ
nvml.temp 温度
nvml.process.used_gpu_memory プロセス毎の使用メモリ

zabbix

zabbix templateも作ってる人がいるので、比較的楽に監視ができる。
nonbiri-tereka.hatenablog.com
AWSとかだったら、メトリクスをcloud watch側で指定して監視したほうが取り回しは良さそう。

画像に使用されているRGBのピクセル数を確認したい

コード

画像に使われるRGBを確認したかったので、RGB数を棒グラフで表示するスクリプトを書いた。棒グラフはそのRGB色で、ピクセル数の多い順に表示。

import time
from PIL import Image
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt

#設定
first = 1 #上位何色からプロットするか
num = 15 #上位何色までプロットするか

# 画像読み込み
img = Image.open("3.png")
img_rgb = img.convert("RGB")
width, height = img_rgb.size

# RGB ピクセル数カウント
num_rgb_px = {}
for x1 in range(width):
    for y1 in range(height):
        r1,g1,b1 = img_rgb.getpixel((x1,y1))

        key = "{:0=3}{:0=3}{:0=3}".format(r1,g1,b1)
        if key in num_rgb_px:
            num_rgb_px.update({key:num_rgb_px[key]+1})
        else:
            num_rgb_px.update({key:1})

# Dataframe化
df = pd.DataFrame(list(num_rgb_px.items()),columns=['RGBkey','count'])
df["R"] = None
df["G"] = None
df["B"] = None

for index, item in df.iterrows():
    r1 = item["RGBkey"][0:3]
    g1 = item["RGBkey"][3:6]
    b1 = item["RGBkey"][6:9]
    df.at[index,"R"] = r1
    df.at[index,"G"] = g1
    df.at[index,"B"] = b1

#ピクセル数順にソート
df_s = df.sort_values("count",ascending=False)

# プロットの為の整形
a=df_s[first:num]["count"]
c=df_s[first:num][["R","G","B"]].values
color_list=[]
for row in c:
    color_list.append([int(num)/255 for num in row])

#プロット
plt.figure()
a.plot(kind="bar",figsize=(10,5)
       ,color=color_list
       ,width=1)
plt.show()

結果

入力した画像

f:id:awkw66:20190224225545p:plain
入力画像(3.png)

得られた結果

f:id:awkw66:20190224231017p:plain
出力画像
※x軸ラベルは、RGB値(R=255,G=111,B=0の場合、"255111000")。Y軸はピクセル数。

linuxコマンド覚えようね

Linuxコマンドなんてcdとlsくらいしか知らんかったのですが、さすがにそれだとWebサーバのデバッグなんかに支障をきたす。 今日デバッグしてて知った便利なコマンドだけメモ。

その1 watch

pythonで立ち上げたサーバにHttpリクエストが飛んできたときにCPUやメモリが動くか1秒毎に画面更新して見るのに使った。

watch -n 1 "ps -au | grep python"

その2 tail

サーバのlogファイルとかは、非常にサイズがでかい場合があって、そういうのをcatで見ようとすると爆発する。そんなときに、最終行から指定行だけみる為にtailを使う。 オプションで-Fをつければ画面表示したままファイルに更新があれば画面に反映されて便利。こちらもHttpリクエストの受付がちゃんとできてるかデバッグに使用。

tail -F hoge.txt

おわり

bottleのマルチスレッド化

pythonAPI作ろうと思ったらbottleってのがでてきた。 よくわかんないままコピペして使ったけど、シングルスレッドだった。マルチスレッド化したい。

答え

自分用メモ

(1) waitressのインストール

pip install waitress

(2) bottleサーバとしてwaitressを指定

run(server="waitress", host='localhost', port=80)

おわり