Amazon Sagemaker 推論モデルを構築、テストし、AWS Lambda にデプロイする

元記事

aws.amazon.com

Amazon SageMaker

  • MLモデルを迅速・簡単に構築、学習、デプロイできる完全マネージド型プラットフォーム
  • MLモデルをデプロイすると、モデルをホストし推論を提供するAPIエンドポイントを提供
  • AES IoT Greengrassも使用できる

SageMakerの柔軟性の高さ故にLambdaでモデルをホストしたくてもできない場合がある

どのような場合か

  • GPUが必要な場合にすべてのモデルをAWS Lambdaでホストできるわけではない
  • Lambdaのデプロイパッケージのサイズなど その他の制限により、Lambdaを使用できない場合も

Lambdaが使える場合の利点

  • 低コスト
  • イベントトリガー
  • シームレスなスケーラビリティ
  • スパイクリクエス

このチュートリアルでやったこと

推論を提供するLambda関数を構築、テスト、デプロイするためのパイプラインを作成

前提条件(使用経験)

  • SageMaker
  • CloudFormation
  • Lambda
  • Code suite

アーキテクチャの説明

https://d2908q01vomqb2.cloudfront.net/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59/2019/08/30/sagemaker-lambda-1.gif

AWS開発者用ツールを使用

Amazon SageMaker を使用してモデルをトレーニングすると、出力モデルが Amazon S3 バケットに保存されます。ファイルがバケットに入れられるたびに、AWS CloudTrail は Amazon CloudWatch イベントをトリガーします。このイベントは Lambda 関数を呼び出して、アップロードされたファイルが新しいモデルファイルかどうかを確認します。次に、このファイルを別の S3 バケットに移動させます。Amazon SageMaker は、モデルファイルとともに、チェックポイントなどの他のファイルを異なるフォルダに保存するため、これが必要です。ただし、AWS CodePipeline をトリガーするには、S3 バケットの特定のフォルダに特定のファイルが必要です。

そのため、モデルファイルが Amazon SageMaker バケットから宛先バケットに移動した後、AWS CodePipeline がトリガーされます。最初に、AWS CodePipeline は AWS CodeBuild を呼び出して以下の 3 つのアイテムを作成します。

  • Lambda 関数のデプロイパッケージ。
  • API を作成するための AWS サーバーレスアプリケーションモデル (AWS SAM) テンプレート。
  • 推論に役立つ Lambda 関数。 これが完了すると、AWS CodePipeline は変更セットを実行して、AWS SAM テンプレートを AWS CloudFormation テンプレートに変換します。テンプレートが実行されると、AWS CodeDeploy がトリガーされます。AWS CodeDeploy は Lambda 関数を呼び出して、最新バージョンのモデルで新しく作成された Lambda 関数が期待どおりに動作しているかどうかをテストします。その場合、AWS CodeDeploy はトラフィックを古いバージョンから最新バージョンの Lambda 関数のモデルに移行します。次に、デプロイが完了します。

## Lambda関数のデプロイパッケージの作成方法

github.com

  • AWS Cloud Formationテンプレート
    • パイプラインを生成するために作成
    • AWS CodeBuildがこの(どの?)パッケージを作成する方法について書かれている
    • APIとLambda 関数自体を生成するためのAWS SAMテンプレートの作成方法についても述べられている

下記がコード例

- "git clone ${GitRepository}"
- "cd ${GitRepositoryName}"
- "rm -rf .git "
- "ls -al "
- "aws s3 cp s3://${SourceBucket}/${SourceS3ObjectKey} ."
- "tar zxf ${SourceS3ObjectKey}"
- "ls -al"
- "pwd"
- "rm -f ${SourceS3ObjectKey}"
- "aws cloudformation package --template-file samTemplateLambdaChecker.yaml --s3-bucket ${SourceBucket} --output-template-file ../outputSamTemplate.yaml"
- "cp samTemplateLambdaChecker.yaml ../"
  1. Githubから必要なファイル(Lambda コード、Lambda関数チェッカー, SAMテンプレート)をダウンロード
  2. CodeBuildがS3から最新のmodel.tar.gzファイルをコピー(どこに?)

  3. 動作するには、Lambda関数にもApache MXNet依存関係が必要  - 今回使用するCloudFormationテンプレートは、Lambdaで推論を実行するために必要なMXNetライブライを含むLambdaレイヤーを作成する。

パイプラインのテスト

モデルファイルの異動先の

モデルファイルの異動先の新しいS3バケットを作成

S3バケットにファイルを追加

テンプレートのダウンロード

CloudFormation テンプレートを起動

シミュレーション

モデルのダウンロード

テスト

まとめ

TBW

お気持ち

TBW

疑問・わからないこと

TBW

AWS Data Wranglerを使って、簡単にETL処理を実現する

チュートリアル内容

aws.amazon.com


これまで

  • Amazon Athena, Amazon Redshiftからデータを取得しETL(*)処理を行う際、PyAthenaやboto3、Pandasなどを利用することが多い。
    • 本来実施したいETLコーディングまでに接続設定を書いたり、各種コーディングが必要

ブレイクスルー

  • Data Wraglerを利用することで、ETLの処理の記述内容に集中することができる。
  • AthenaやS3上のCSVから数行でPandasを利用できる

Data Wraglerの特徴

  • インスタンスに対してpipでインストールできる
  • Lambda Layerとしての利用やGlue上でeggファイルをアップロードして利用できる。

チュートリアルの実行

Athena

1-4.サービス一覧から“Athena”を選択します。

1-5.下記クエリを実行し、Athenaのデータベースとテーブルを作成します。

データベースの作成

CREATE DATABASE [YOUR DATABASE NAME]; 

しかし、Athenaでエラーがでる f:id:triwave33:20191002000144p:plain

原因はデータベース名にハイフンをつけたから

Athenaの外部テーブル作成でエラー ハイフンに注意! | knowledge capsule

アンダーバーに変えて無事作成

テーブルの作成

"Only one sql allowed" エラーが発生 最後の2行のstatementが改行されていたのが原因。 Format queryボタンをクリックすると整列されて問題解決

確認のクエリ

select count(*) from green_tripdata; 

SageMaker Notebookの起動

新しいノートブックの作成

  • IAMロールのアタッチ:S3, Athena フルアクセス

ノートブック実行

・conda_python3カーネルで新規ファイル作成

・Data Wranglerのインストール

!pip install awswrangler

pythonからAthenaでクエリを実行するコードをノートブックで実行

import pandas
import awswrangler

session = awswrangler.Session()
df = session.pandas.read_sql_athena(
    sql="select * from green_tripdata",
    database="[YOUR DATABASE NAME]"
)

print(df)
ETLの実行

4-1.“trip_distance”が0のデータは分析対象外とみなし、行の削除処理を行います。

## trip_distanceが0の値を抽出、件数確認
rows_drop = df.index[df["trip_distance"] == 0.00]

print(df.loc[rows_drop].count())

## trip_distanceが0の値を削除、件数確認
df_drop = df.drop(rows_drop)
print(df_drop)

df_lens = df_drop.count()
print(df_lens)
さらにデータカラムの書き換え(省略)
CSVファイルをS3に出力
## trip_distanceが0の値を抽出、件数確認
rows_drop = df.index[df["trip_distance"] == 0.00]

print(df.loc[rows_drop].count())

## trip_distanceが0の値を削除、件数確認
df_drop = df.drop(rows_drop)
print(df_drop)

df_lens = df_drop.count()
print(df_lens)

お気持ち

  • S3, Athenaとの連携をSageMaker上で行うことができる
  • AWS Data Wranglerを使ってクエリを発行、pandas dfで取得
  • そのままPythonで処理できるところがメリット

疑問・解決していないこと

  • 各サービス(S3, Athena, SageMaker)が独立していて全体のアーキテクチャが見えにくい。一括して管理できるような仕組みはない?
  • Lambda layer としての利用やGlue上での利用の記載はない

アナログシンセキットを作った(Digilog製 AnaLog Kit)

f:id:triwave33:20190704221923j:plain

発端

Maker Faire Tokyo 2018でアナログシンセ基板を買ってきた

f:id:triwave33:20190704223536j:plain
Maker Faire Tokyo 2018

大分古い話ですが、昨年8月にビッグサイトで行われてきたMaker Faire Tokyo 2018に行ってきました。

f:id:triwave33:20190704224000j:plain
すごい人

すごい人だかりで、面白い電子工作がたくさん。機械学習の試みもたくさんありました。 楽器系も色々あってエアコンやバーコードスキャナを使った楽器など、とても楽しめました。

そんな中、目に止まったのがOCTAなど個性的なシンセサイザーの展示・販売をしていたDigiLogさん。

www.digilog.tokyo

f:id:triwave33:20190704225123p:plain
マルチシンセサイザーOCTA

他にも商品をみていると、パーツむき出しのイカしたアナログシンセが! 完成品と基板のみの販売でした。

f:id:triwave33:20190704225851j:plain
委託販売先のスイッチサイエンスさんからお借りしました。

長年アナログシンセを作りたいと思い腰が重く止まっていました。 このシンセなら部品の入手も用意だし、最初のとっかかりとしては 最適だなと思い基板のみを購入しました。

f:id:triwave33:20190704230534j:plain
ふたたびスイッチサイエンスさんから拝借

基板のみ、もしくは基板+部品もスイッチサイエンスさんから購入できます。 完成品はDigiLogさんのHPでは売り切れとなってます。

www.switch-science.com

パーツ調達

秋葉原に行き、秋月と千石電商で調達。特に入手困難な部品はなかった。 家で一人になれる時間があったので、隙をみて製作開始。

製作

特に難しいところはなく、パーツもあまり密集していないのでサクサクいく。

f:id:triwave33:20190704221851j:plain
部品を置いたこところ

抵抗の数値を間違えないよう慎重に。

途中0Ω抵抗が家からでてきたので、なんのためにあるのか気になり集合知Twitter)に聞く

f:id:triwave33:20190704221818j:plain
0Ω抵抗

0Ω抵抗の存在意義は

  • 試作時に将来抵抗が必要になりそうなところにつけておいて、必要なら差し替える
  • テスターやプローブを当てやすくするため
  • CAD作製時にアナログとデジタルのグラウンドを分離するため(CAD処理上の問題)

とのこと。みなさんありがとうございました。参考になりました。

その後、パーツをすべて付け足して終了。配線はわずかです。 可変抵抗ポットも端子を基板に直接ハンダ付けするので楽チン。

f:id:triwave33:20190704232233j:plain

ということで製作自体は数時間で完成。思ったより部品点数が多くて疲れた。。

f:id:triwave33:20190704221923j:plain
完成系(電源スイッチつけ忘れ)

スペック

DigiLogさんのHPより

1 VCO (SAW,OCT/V) 1 VCF (4 STAGE LADDER) 1 ENVELOPE (Release,Amount,CutOff)

つまみは左から、Tune, Decay, Env bias, Cutoff, Resonance Env biasがちょっとよくわからないです。ググったけど一般的なことばではなさそうだし。 絞るとカットオフのような高域フィルタ、上げるとグッとブーミーないい音になります。 ただし、Cutoff, Resonanceの値に依存するようで使いかたはまだ勉強中です。

Decay(Release)はあまり効かないような。。。VCOに関するDecayなのかVCFに関するものなのか、 Digilogのyoutube動画でもあんまり効きがよくわからない。

youtu.be

今後

そんなにトラブルことなくアナログシンセサイザーAnaLog Kitの製作が完了しました。 ただ、これはあくまで音源ユニットであるので音程(CV)と打鍵(GATE)の信号を入力する必要があります。 シンセの入力機器としてはキーボードもしくはシーケンサがあります。 KORGシーケンサSQ-1を買いました。これでシーケンスステップをAnaLog Kitで鳴らすことができます。

オシロで波形確認&キーボードでの演奏

三角波LFOが出てます。レゾナンスも効いてる。 むき出しパーツなので手で触るとノイズが乗って楽しい(非推奨)

また、SQ-1ではキーボードからのMIDI信号をCVおよびGATEに変換する機能はありませんが、 PCにつないで、DTMソフトからのMIDI信号をCV、GATEに変換することはできます。 この機能を利用してキーボードから今回作ったAnaLog Kitを演奏することも可能です。 つぎのブログではそのあたりを書きます。

Happy Hacking Keyboard搭載のPCがないので作ってみた(4. 開発スタイル編)

4. 開発スタイル編

f:id:triwave33:20190327203846p:plain
完成したHHKB Pi

HHKBにRaspiとディスプレイをくっつけた持ち運び式のPCを作りました。これで外にいながら楽しいコーデイングライフが送れます。

これをみて同じものを作りたくなった方がどれくらいいるかわかりませんが、最後の記事として自分の開発スタイルを書いておきます。もちろん、それでないとできないわけではないので各自お好きな方法をとっていただければOKです。

コーディング環境

 必要なものは

  • tmux
  • vim
  • iPython

です。

tmux の設定

~/.tmux.confに

# Resize pane
bind-key -r H resize-pane -L 5
bind-key -r J resize-pane -D 5
bind-key -r K resize-pane -U 5
bind-key -r L resize-pane -R 5

# Change active pane
bind-key h select-pane -L
bind-key j select-pane -D
bind-key k select-pane -U
bind-key l select-pane -R

と書きます。これで

  • ctrl-b (prefix) + HJKL でペインの分割サイズ切り替え
  • ctrl-b (prefix) + hjkl でペイン間の移動

ができます。

hjklの順に左下上右です。ここらへんはvimバインディングと統一していますね。

vimの設定

 お好きにどうぞ。僕はvimですがemacsでもnanoでも構いません(宗教戦争コワイ)

Python でのコーディングスタイル

それでは、作成した開発環境で試しに以下のようなスクリプトと図を作成してみましょう。

import numpy as np
import matplotlib.pyplot as plt

N= 10
sigma = 0.1

# sample
x = np.random.rand(N) * 2* np.pi # [0, 2pi]
y = np.random.normal(loc=np.sin(x),scale=sigma,size=N)  # add Gaussian noise

# answer (Ground Truth)
x_gt = np.linspace(0,2*np.pi, 100)
y_gt = np.sin(x_gt)

# plot
plt.scatter(x,y)
plt.plot(x_gt, y_gt)
plt.savefig('test.png')
plt.close()

f:id:triwave33:20190407145547p:plain

 サンプル点から何らかの回帰分析をおこなって、回帰曲線を作図します。回帰曲線はなんらかの機械学習、統計処理で求めた予測値ですが、ここでは単純に正解(sine波)を使っています。

0. matplotlibの下準備

さて、CLIモードでは何もせずにpltクラスのメソッドを呼び出すとエラーが帰ります。これは、デフォルトで使われているmatplotlibのバックエンド(確か'TkAgg'だったっけな)がXサーバーを使うようになっているからで、Xサーバを使えないCLIモードではエラーが返ります。

これを防ぐために、matplotlibのバックエンドを変更しましょう。実行したいコードの先頭(pltのインポート前)に

import matplotlib
matplotlib.use('Agg')

と入れる方法でも良いですし、永続的に変えたい場合は

~/.config/matplotlib/matplotlibrc に

backend:    Agg

と加えます。

1.作業ウィンドウの準備

IDEのように、画面の上側にエディタ、下側にコンソール(コード実行画面)を配置します。

1.1 tmuxを起動

f:id:triwave33:20190407151814p:plain

1.2 画面を横分割

ctrl-b + "

(ctrl を押しながらbを押す。離してから " を押す)

f:id:triwave33:20190407152057p:plain

画面が分割されました。

注:最初の動画では縦分割にしてしましました。縦の方が好みの場合ctrl-b %を使ってください

1.3 画面のサイズを変更

現在アクティブなペインは下側になっています。このペインを下側に広げます。

ctrl-b + J

(ctrl を押しながらbを押す。離してから shift + jを押す)

f:id:triwave33:20190407152605p:plain

ペインのサイズが変わりましたね。上に広げるにはK、下に広げるにはJを押します。連続で押せば複数回変えられます。

1.4 上側のペインにエディタを起動

上側のペインに移動

ctrl-b + k

上側のペインでエディタを起動
vim test.py

1.5 下側のペインにiPythonを起動

下側のペインに移動

ctrl-b + j

仮想環境に入ってiPythonを起動
source activate py36
ipython

2. コーディング

2.1 上側のエディタにコードを書いていく

f:id:triwave33:20190407153738p:plain

変数x,yを定義しました。ここまでの結果を実行して変数x, yの値を確認したいとします。

2.2 下側のペインに移動し、スクリプトを実行

iPythonでは%runというマジックコマンドを使ってスクリプトを実行できます。(runという名前の変数を作らなければ%無しでもいけます)

ipythonコンソール上で

run test.py

と実行してみてください。(シェルのようにtab補完も効きます)

f:id:triwave33:20190407154955p:plain

ipythonコンソール上でスクリプトが実行されます。iPython上でスクリプトを打ち込んだのと同じ効果が得られるので、変数はiPython上にロードされています。

2.3 変数の確認

whoとコマンドを打てば、ipythonコンソール上の変数を確認できます。

f:id:triwave33:20190407155319p:plain

これで、下のipythonウインドウでインタラクティブな開発が可能になります。

f:id:triwave33:20190407160014p:plain

上の図ではiPythonコンソール上で、変数xやyを使って平均や標準偏差を求めて確認しています。

3. 作成した図の確認

上記のスクリプトを完成させて実行すると。test.pngがiPythonの作業ディレクトリ上に生成されているはずです。CLI上でこれを実行するには、fbiコマンドを使います。

3.1 インストール

sudo apt-get install fbi

3.2 画像の確認

fbi -a test.png

で表示されるはずです。(-aオプションは画像サイズの自動調整) tmux上で実行する場合には

fbi -vt 1 -a test.png

でいけるはずです。

qiita.com

Is it possible to run fbi inside tmux if the tmux if running in a virtual tty? - Unix & Linux Stack Exchange

iPython + エディタ開発のメリット

 CLI版(マウスを使わない)でiPythonを使ってデータ分析を行なっている最大の利点は、マウスを使わず、かつホームポジション上のキーのみで操作が完結するので、コーディングと実行・評価が圧倒的に早くなる点です。


  • HHKB:   タイプしやすい、無駄なキーがない
  • CLIモード: マウスを必要としないので、全てをキーボードで操作
  • vim:    矢印キーなどを行わず、ホームポジションで全ての動作を完結
  • tmux :   ペイン(アプリケーション)の高速切り替え
  • iPython:  1ライナーでコーディング途中にどんどんtry & errorができる

 手が遊んでいる暇をなるべく短くすることを突き詰めてこのスタイルになりました。もちろん、JupyterやVS codeなどのIDEも使いますが、

  • Jupyter: 人に見せたりするレポーティング用
  • VS code: 大規模なシステムの開発

 例えば、Jupyterで1ラインでコードを実行していって、「これ一々消すの面倒だな」と思ったことのある人はiPythonを使って見てください。(Jupyterのプラグインであったりして)

課題

CLIにしたことで犠牲にしている機能もあります。

つまるところ、Xサーバが使えないことに起因するものです。現在。

1) クリップボードの使用(エディタ上の行単位のコードをiPythonで実行) 2) plt.show()の使用(いちいち画像保存するのは面倒) 3) キーバインドの使用(矢印キーをctrl + hjklに)

ができません。1)は結構いたくて、エディタから1行コピーしてiPythonで実行させるときは

yy  (1行ヤンク(クリップボードにコピー))
ctrl-b (iPythonに切り替え)
paste (クリップボードの内容をiPythonで実行)

と一連の動作で2秒以内に実行できます。キーバインドも、iPythonで矢印キーを使うとホームポジションが崩れるので少し遅くなります。

 上記をどうしても使いたい場合は、GUIモードでログインしてターミナルを立ち上げて操作しています。結局GUIモードでCLIをしている、割合快適なのですが、ちょっと悔しいですね。解決方法があればコメントいただけると幸いです。

実行速度について

 

 最後にそもそもの疑問として、

Raspberry Piの処理能力でデータ分析ができるのか?」

というところですが、私は十分可能だと思います。さすがにGPUを使うようなディープラーニング系のフレームワークをバリバリ使うのは非現実的ですが、pandasで数万行のデータを読み込んで、numpy、matplotlibなどを駆使してEDA(探索的データ解析)を行うことは可能です。*1

 DLのコードを書くときも動作確認まではraspiで済ませて、しておいて、エラーがでなければ自宅のサーバやクラウドで実行という手も使えます。これは今後試してみるつもりです。

最後に

 特定のキーボードを使ってラズパイPCを作るというかなりニッチな記事になりました。シャレで作ったところもあるのですが、現在は完全にメイン機になっています。何せ、これを持ち運べばどこへいっても大好きなHHKBでコーディングができるのですから。好きなキーボードだけを使うことによるストレスからの解放とQOLの上昇はとてつもないものがあります。*2

 ご興味のある人はぜひトライして、僕に見せていただけたらと思います。また、自作キーボードへの興味も湧いてきましt。

 

 

*1:待ち時間を感じるときもありますが、そんなときは別ペインに切り替えてコーディングを行なっていれば良いのでそんなに区ではありません。

*2:これを気に、職場の据え置きPC、持ち歩きPCも全てHHKBにしました

Happy Hacking Keyboard搭載のPCがないので作ってみた(3. 環境構築編)

 

f:id:triwave33:20190327203846p:plain

 

Raspberry pi機械学習環境を整える 

 さて、その1、その2でraspiを搭載したHHKBを作りました。さぁ、これを使って楽しいコーデイングライフを送りましょう!私の用途は主に機械学習系のコードをPythonで書いて実行です。その際の環境構築について主に書きます。

 

 Raspiの処理能力を最大限に使うために、基本的にはCUIで全て動作させています。

triwave33.hatenablog.com

 

 

triwave33.hatenablog.com

 

CUI編(共通編)

OS 

下記リンクのRaspbian strech wigh DektopをダウンロードしてSDカードに焼きます。普通のRaspiのセッティングです。

Download Raspbian for Raspberry Pi

 

f:id:triwave33:20190407111627p:plain

なお、

 

 

sudo raspi-config

3. Boot Options -> B1. Desktop /CLI -> B1 Console

 

にしておいて、起動時にCLIが立ち上がるようにしておきます。

 

フォントの変更

それではCLIで起動させてみましょう。おなじみの起動画面です。デフォルトのフォントはなんか堅いですね。視認性が良くなく、コーディング向きではないので変えましょう。

f:id:triwave33:20190407112611j:plain

 

 

/etc/default/console-setupを開いて

FONTFACE="TerminusBold"
FONTSIZE="14x28"

にしました。 

console-setup(5) — console-setup — Debian stretch — Debian Manpages

 

このあたりは好みで変えてください。

f:id:triwave33:20190407114245j:plain

いい感じになりましたね。

 

Python環境

berricondaのインストール

ラズパイでも仮想環境を使いたい。そんな場合はberrycondaを入れましょう。

github.com

 

インストール方法は、readmeに従えば良いです。

自分の環境に対応するshファイルを落としてきて、下記のように入力するとインストーラーが開きます

 

chmod +x Berryconda3-2.0.0-Linux-armv7l.sh
./Berryconda3-2.0.0-Linux-armv7l.sh

 

最後に、「pathを設定しますか?」的なことを聞かれるので、yesにしておきます。

デフォルトでは~/以下に設定されます。

 

仮想環境の作成

通常のanacondaと同様です。例えば

conda create -n py36 python=3.6 

で環境名"py36"でpython3.6の環境をインストールします。

python2系を入れると今時は小学生にもバカにされるらしいので、3系を入れときましょう。仮想環境に入るときは

source activate py36

 

pythonライブラリのインストール

condaコマンドを使って入れていきます。pipでも入りますが、raspiの処理能力ではコンパイルに時間がかかります。condaの方が早いのでなるべくcondaで入れましょう。2018年4月現在、良く使いそうなライブラリでいうと

 

  • numpy    1.15.1
  • scipy      1.0.0
  • pandas   0.23.4
  • matplotlib 2.1.2
  • scikit-learn 0.19.2

になっています。

機械学習

pipで特に問題なく入ります。自分の使いやすいバージョンを入れてください。私の環境をざっとみると

 

  • tensorflow    1.12.0
  • Keras     2.2.4
  • chainer     5.2.0
  • gym     0.11.0
画像系

特に問題なく入っています。(バージョン忘れた)

入らないもの

 現在確認できているもので、下記のものは64bit versionのpythonでの動作が要求されているのでraspbian (32bit)ではインストールできません。

  • LightGBM
  • PyTorch

 ここらへんが使えないのはちょっと痛いですね。(Kagglerが去っていきそう。そもそもKagglerがraspi使わないか。。)

 

raspi3からは64bit環境になっているので64bit対応のOSを入れることを検討しています。

 

開発環境

 さて、Pythonが入ったのでバリバリコーディングしていきましょう。

ん、IDEは?VS Code、それともPyCharm?Jupyterはどうやって使うの?

 すみません、CLIなので、上記は使えません。(ここまで読んでいて期待ハズレだった方ゴメンなさい。)

 

 

 だけど、大規模システムならともかく、数ファイルで完結するソースコードならCLIで楽々作れちゃいます。次回はエディタとiPythonコンソールを切り替えながら、高速にコーディングしていくスタイルを紹介します。

ギターエフェクター用のエクスプレッションスイッチを作った

f:id:triwave33:20190401234807j:plain

ギター用のエクスプレッションスイッチを作った

 

 どうもtriwaveというものです。普段はtwitterやqiitaで機械学習や統計に関することを呟いています。現在はソフトウェアエンジニアに分類されると思うのですが、前職ではセンサ開発などハードウェア周りの研究開発もやっていました。

 

 趣味で音楽を聞きますし、楽器を演奏することもあります。楽器、主にギター周りの電子、電気工作もボチボチやっています。はてブはポエム的要素が強いので、自分が過去に作ったものを(成仏させる意味で)紹介していこうと思います。

 

 今回は、エクスプレッションペダルの固定版(フットスイッチで二つの音量を切り替える)の工作記です。初回からめちゃくちゃ地味です。

 

 

エクスプレッションペダルとは?

 このページを読もうと思って読み進めてる人には必要がないかもしれませんが、一通り説明します。ギターを引いているときにボリュームを調整したいことがあります。例えば、静かなパートでボリュームを絞りたい場合、またソロの時にボリュームを上げたい場合。

 

 こんなときに足にあるペダルを踏み込むことで(その踏み込み量で)音量を変えることができます。ペダルの形式にはざっくり分けて2種類あって、

  • ボリュームペダル
  • エクスプレッションペダル

の2種類です。

 

 

ボリュームペダルは、ギター→エフェクター→アンプの間に直列に繋いで、オーディオ信号そのものをペダルによって直接増幅・減衰させます。

 

 

 

f:id:triwave33:20190402000735p:plain

ボリュームペダル(BOSS製)

 

ボリュームペダルは直列につなげて、シンプルな構成になりますが、ペダルそのものオーディオ信号が通過することで音質が変わるというデメリットがあります。

 

対して、エクスプレッションペダルとは、エフェクターなどギター信号を加工する機器につないで、その機器のパラメータを変更させる(その一例が音量)ものです。エクスプレッションペダルにはオーディオ信号が通らないところがポイントです。エクスプレッションペダル単体ではボリューム(パラメータ)を調整できません。

f:id:triwave33:20190402004406j:plain



 

エクスプレッションスイッチ

 今回作ったものはエクスプレッションスイッチとでも呼ぶものです。ペダルで音量を調整していたときもありましたが、

  • 上述の音質変化
  • 重くてかさばる(ペダルなので頑丈な筐体のものが多い)
  • 踏み幅が大きいと、狙った音量にするのがむしろ難しい

の不満がありました。結局、私の場合音量大と音量小の2段階くらいの調整で大体済むことが多いです。

そこで、フットスイッチを使って

  • スイッチOFF(音量100%MAX)
  • スイッチON(音量0-100% ツマミで可変)

にしておいて、ONの時の音量をあらかじめ決めておき、スイッチのオンオフをする方が再現性良く演奏できます。

f:id:triwave33:20190401234807j:plain

中央がスイッチON時の音量調節ツマミ、下がオンオフ用のフットスイッチ

これだと、小さく(大体フリスクくらいの底面積)作れるので持ち運びがラクです。また、(当時)外部パラメータ調整のできるデジタルエフェクターを使っていたので、ボリュームペダルではなく、エクスプレッションペダル(のスイッチ版)を作ることにしました。

回路

 エクスプレッションペダル(スイッチ)の回路はとてもシンプルで、本体側になんらかの形で音量に相当する信号を伝えてあげるだけです。方法としては

  • 電圧を伝える(例:0V(min)-5V (max)として電圧で伝える。分圧回路を使う)
  • 抵抗値を伝える(使用する抵抗値の上限は本体側で決まる)

手持ちのデジタルエフェクターの方式に合わせ、今回は下の方式のものを作りました。

調べると抵抗値のMAXは50kΩとのことだったので、その値を用いました。

f:id:triwave33:20190401235842j:plain

配線図(ハンダはご愛嬌。。)

f:id:triwave33:20190402004401j:plain

実体配線図


 回路は本当にシンプルで、3P3Tスイッチ(LEDをつけなければDPDTでも良い)を使って、スイッチオフのときは47kΩの固定抵抗を通るように、スイッチオンのときは50kΩ maxの可変抵抗を通るようにするだけです。音量変えるときはBカーブでなくAカーブを使った方が良いかも。。もう一組みのスイッチ端子にはLEDをつけてどちらの状態かをわかるようにしています。この配線図の場合、音量可変時にライトが点くようにしています。

 LEDの電源ですが、コンパクトにしたかったため外部電源を供給するようにしていますが、ボタン電池などで内臓しても良いでしょう。もちろん電源はLEDのためだけに必要なので、ボリューム調整自体はパッシブで(電源なしで動作します)

 

一応なんちゃって回路図も乗っけておきます。

f:id:triwave33:20190401235854j:plain

回路図

 

 主にエレアコの音量調整用に使っていました。音量増幅用のブースター(良いものは大体1万円くらいで高価だし、直列に繋ぐのでアコギの場合は音質変化が気になる)を買わなくても、コンパクトに音量のプリセット切り替えを実現できました。

 使用法としては、コードで引く場合スイッチONでボリューム70%、単音で弾く時にはスイッチOFFでボリューム100%というような使い方です。(オンとオフが感覚的に逆に感じるかもしれませんが、どっちがオンでオフかは相対的なものなので気にしないでください。)

 本機はエクスプレッション端子のあるエフェクターに用途が限られます。まぁだから正直そんなに使わなかったですね。なんとなく作ってみたくなったので作ったのが正しいかも。ただ、MIDIのコントロールチェンジ(CC)などにも使えるので手元に置いています。もちろん、ギターエフェクターで音量以外のパラメータにも使えます(本体が対応していれば)

 

 楽器の音質に直接影響を及ぼすものに関しては、多少筐体が大きかったりしても無理して使います。逆に、今回のようなあくまで外部機器のパラメータ調整のための機器って、なかなかその人の好みに合わせることは難しいと思います。人によって欲しいサイズとか、機能とかって違うと思うので。そういう個々人の痒いところに手が届くものは自分で作ったりします。

 

 

Happy Hacking Keyboard搭載のPCがないので作ってみた(2. 工作編)

f:id:triwave33:20190327203846p:plain

Happy Hacking KeyBoard搭載のPCがないので作ってみた(2. 工作編)

 

 

triwave33.hatenablog.com

 

さて、その1で作りたいイメージとブツが届いたので早速作っていきましょう。

 

 

 

作り方はとっても簡単で、ディスプレイにラズパイつけてそれをHHKBにトルクヒンジで接続するだけです。

ディスプレイとラズパイの接続

f:id:triwave33:20190328002015p:plain


ディスプレイの裏側にRaspi Zero(とバッテリー)を配置します。収まりがよさそうなのですが、配線の問題上ここにバッテリーが置けないことがわかったので、Raspi 3にします。

 

f:id:triwave33:20190328002347p:plain



画面の下側にあるネジ穴はスタンド固定用のものです

。これを使ってHHKBと繋げることにします。

 

HHKBとディスプレイの接続

注:ここから先は(HHKB純粋主義者にとって)ショッキングな内容が含まれています。HHKBに傷をつけることは許さんという人はそっとブラウザを閉じてください。

f:id:triwave33:20190328002747p:plain


HHKBを後ろから見た図です。分解して、穴を開けたい位置に基板がないか確認します。幸いにも十分なスペースがありました。

f:id:triwave33:20190328002950p:plain

ドリルで下穴を開けて、タップ(ネジ穴)を立てます。裏からナットで止められなくもなかったかな。

 

同じような穴を4箇所開けてトルクヒンジを付けます。反対側をディスプレイに固定すれば完成!

 

f:id:triwave33:20190327203846p:plain

 

f:id:triwave33:20190328003435p:plain

上から見るように折りたたみも・・・

 

 

 

 

f:id:triwave33:20190328004806p:plain

 

 

 

 

できねぇ!

 

まぁこれはトルクヒンジの可動域とかサイズを見てわかってました。治具作らないと無理。そこまではやり切れませんでした。ディスプレイの角度を調整できるのでトルクヒンジの意味はあったとします。持ち歩くときはディスプレイを開いて平にして運びます。

悔しいのでver2に期待です。あるのか?

 

その後

使用感

 紆余曲折ありましたが、晴れて外にHHKBを持ち出してコーディングすることができるようになりました。電車の待ち時間にもHHKB叩けて感動。

f:id:triwave33:20190328004958p:plain

 電車に座って車窓を横目にコーディングするのもオツなものです。(混んでるときはやめよう)。日々、電車で作業できる時間は短くて5分、長くて1時間くらいなので、大体Python使って写経をしたり、pandas芸思い出したり、AtCoderの問題解いたりしてます。

Vim + iPythonで動かします。berrycondaというanacondaのraspi版を使ってます。numpy, scikit-learn, pandas, opencv, tensorflow, chainer, Keras, gym機械学習に必要な系は大体使えます。環境構築に関してはまた別の記事にしようかな。

 

ただ、PyTorchが使えていないのが誤算です。64bitのPythonでしか動作しないらしく、現在のOS(raspbian)は32bit onlyなので。そもそもこれを作ったきっかけが、「雑念を配してPyTorchをひたすら書く」だったので、それができていないのがくやしい。

周りの反応

 電車で使ったり、勉強会に持って行ったりしましたが、声をかけられるなど反応は特にないですね。まぁ、変なもの使ってんなくらいに思われてるか、なんだRaspiかってバレてるかですね。

 ただ、パソコンに詳しくない人には(特に電車で)警戒されます。基板むき出し、配線いっぱい、LED、バッテリーなんかがついてるとテ○リストと思われかねないので対策が必要です。基板を守る意味でも。Raspiだからそんなに痛手じゃないんですけど。

 

良かった点

 やはり、ネット環境につないでいないしCUIメインなので雑念を排してコーディングできるというのは最高ですね。

 これを作ったことにより、

  • 朝通勤→HHKBでコーディング
  • 会社のデスク→HHKBでコーディング
  • 会社のフリースペース→HHKBで物書き
  • 夜通勤→HHKBでコーディング
  • 夜自宅→HHKBでコーディング

と、ほとんどの時間をHHKBとともに過ごせるようになりました。QOLが爆上がりです。ただし日によっては、朝通勤の段階で頑張り過ぎてクタクタになってます。仕事する気力ねぇ。

 

 あと、副次的な効果としてうるさい電車内が気にならなくなりました。やはりメカニカルキーボードなので(大きくはないですが)ノートPCとは違う電車では聞きなれない音がします。静かな車内では気になってのびのび打てないので、賑やかな方が嬉しいとすら思います。いずれにせよ他のノートPCと同様車内の方々のご迷惑にはならないよう、心がける必要があります。(幸い通勤電車はラッシュの人々と逆行するので大抵空いています)

 今後

 「Raspiでできることと割り切る+Raspiでもやってやると燃える」でやってますが、さすがにコンピューティングパワーの限界を感じることもあります。もう少しスペックの良いものはないかなと思案中。こないだ発表されたJetson nanoとかGoogle TPU Edgeとか気になりますね。ただ、そこまでするならPC使えよとなるかも。

cloud.google.com

www.nvidia.com

gigazine.net

 

 これを作ったことでHHKBの名前通り、毎日ハッピーハッキングできていることに幸せを感じます。みなさまも良きハッピーハッキングライフを。

 

 

 

triwave33.hatenablog.com