VSCode + Jupyter でFailed to start the Kernelが発生した

VSCodepythonノートブックを動かそうとしたらタイトルの現象が発生しました。 その時の対応について記録します。

環境

  • OS:windows11 22H2
  • python:3.11.9
  • VSCode:1.88.1
  • Jupyter Extension:v2024.3.1

事象

venvで新しく作成した環境にipynbをインストールし、VSCodeから pythonノートブックのセルを実行すると以下のようなエラーが発生しました。

Failed to start the Kernel.
Bad file descriptor ( C:Users¥runneradmin¥AppData¥Local¥Temp...
View Jupyter log for further details.

対応

エラーでGoogle検索を行ったところ以前のバージョンで同様の事象が発生していました。 その時はpyzmqのバージョンを下げることで改善したそうです。

以前構築した環境では正常に動作していたためその時のpyzmqバージョンを確認したところバージョンは25.2.1でした。

依存ライブラリとして自動でインストールされたpyzmqは26.0だったため、一度アンインストールを行なって再度バージョンを指定しインストールを行いました。

pyzmqのアンインストール

pip uninstall pyzmq

pyzmqのバージョンを指定して再インストール

pip install pyzmq==25.2.1

補足

JupyterとPyZMQの関係性について確認しました。

pyzmqはZeroMQのPythonバインディングで、JupyterはZeroMQを使用して通信を行っています。 Jupyterではカーネルとフロントエンド間のメッセージ送受信を行うためにpyzmqを利用しています。

おわりに

環境構築に失敗するとその後の作業が全く進められないため、早期の解決が望ましいです。

そのような状況に陥った場合に利用しているツールの背後で動いているものが何か、原因はどこにあるか、を判断できるように知識をつけていきたいです。

Gemma 2B をMacで動かしてみた

Googleが公開した Gemma 2B の Instruction Tunedモデルを Transformer で動かした時の記録です。また、1.1BのTiny Llamaとの比較を行いました。

実行環境

実行環境は以下になります。

  • OS:MacOS Sonoma
  • Python:3.10.13
  • Torch:2.2.1
  • Transformers:4.38.1

Gemmaの準備

KaggleからGemma 2B のInstruction Tuned済みモデルをダウンロードします。 Kaggleにログインし以下のモデルカードでModel Valiation からTransformersタブで2b-itを選択します。

環境の準備

最新のTransformersをインストール済みの環境を前提とします。

ダウンロードしたモデルを解凍しその中に以下のソースを追加します。

llm.ipynb

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

tokenizer = AutoTokenizer.from_pretrained("./")
model = AutoModelForCausalLM.from_pretrained("./")

text = ""
token_ids = tokenizer.encode(text, add_special_tokens=True, return_tensors="pt")
token_length = len(token_ids[0])

outputs = model.generate(
        token_ids.to(model.device),
        max_new_tokens=token_length + 100,
        min_new_tokens=token_length + 50
)

tokenizer.decode(outputs[0])

実行

textを"日本について教えてください。"にした場合、出力は以下のようになりました。

<bos>日本について教えてください。\n\n日本はアジアの東部に位置する国です。アジアには多くの国があり、日本はアジアの東部に位置する国の一つです。\n\n日本は歴史的に重要な国です。古代の日本には、多くの伝説や神話があると考えられています。また、日本の歴史には、多くの戦国時代や時代劇があると考えられています。\n\n日本は経済的に重要な国です。日本は、世界で最も経済的な国の一つであり、経済的な成長は非常に高いです。\n\n日本は文化的に重要な国です

Tiny llamaとの比較

軽量LLMのTiny llamaと比較しました。Tiny llamaは日本語での入出力用に学習されていないため以降は英語の入力で比較を行っています。

Gemma 2B it Tiny llama
メモリ使用量 10.14GB 4.36GB
Generate時間 30.97秒 6.46秒

各モデルの出力は以下のようになりました。

Gemma 2B it

<bos>My name is Ken. I am 25 years old and I live in London, England. I am a software engineer and I have been working in the industry for 5 years.\n\nI am a passionate and dedicated individual with a strong work ethic and a thirst for knowledge. I am always looking for new challenges and opportunities to learn and grow.\n\nI am a good communicator and I am always willing to help others. I am also a team player and I am always willing to contribute to the success of the team.\n\nI am a big fan of technology and I am'

Tiny llama

<s> My name is Ken. I am 25 years old and I live in the United States. I am a student at the University of California, Berkeley. I am a member of the American Association of University Professors. I am a member of the American Association of University Professors. I am a member of the American Association of University Professors. I am a member of the American Association of University Professors. I am a member of the American Association of University Professors. I am a member of the American Association of University Professors.'

おわりに

GPUなしで動く高速、軽量モデルへの関心が高まれば、ローカルで動くアプリが生まれるのではないかと思いました。また、cppモデルによる高速化やMacGPUを使った高速化を試していきたいと思います。

Java と Javascript で md5ハッシュ が一致しない現象を調査してみた

JavaJavascriptMD5ハッシュが一致しない現象に遭遇した時の記録です。

はじめに

Androidアプリで文字列の一致を確認するために、MD5ハッシュを取得し比較する処理を使っていました。

アプリ内では、平文が与えられるとJavaJavascriptでそれぞれMD5ハッシュを取得し、Javascript 側で比較を行います。

参考:MD5とは

ja.wikipedia.org

具体的な構成は以下のようになります。

構成

発生した現象

特定の平文を与えるとJavaJavascriptで取得できるMD5ハッシュが異なっているため、比較の判定でNGが返ってきました。

平文

test

Javascript側の返り値

098f6bcd4621d373cade4e832627b4f

Java側の返り値

98f6bcd4621d373cade4e832627b4f6

Javascript側の実装

以下のOSSを使ってMD5ハッシュを取得します。

github.com

JavaScript-MD5を外部ファイルとして読み込んでから、以下のコードを実行することで平文のMD5ハッシュを取得します。

入力

console.log(md5("平文"));

コンソール出力

fc1e8849b94f899c2dbf68d8a4ceac4e

Java側の実装

MessageDigestを使ってMD5ハッシュを取得します。

docs.oracle.com

JavaMD5ハッシュ文字列取得関数は以下のような関数に"message"を渡して実行することで、平文からMD5ハッシュを取得します。

// メッセージダイジェストインスタンスを作成
MessageDigest md5 = MessageDigest.getInstance("md5");
// 平文からMD5ハッシュのバイト列を取得
byte[] md5_byte = md5.digest(message.getBytes());
// BigIntegerに変換
BigInteger md5_int = new BigInteger(1, md5_byte);
// BigIntegerから16進数の文字列に変換
return String.format("%02x", md5_int);

入力

System.out.println(getMD5Hash("平文"));

コンソール出力

fc1e8849b94f899c2dbf68d8a4ceac4e

原因

この現象の原因はJava側の実装です。 Java側の実装としては以下のような動きになっていました。

数値変換

MessageDigestインスタンスの出力はバイト列のため、一度10進数に変換しています。この時、先頭バイトの上位4bitが「0000」の場合16進数変換で先頭の0が消されていることがわかりました。

先頭の0が消滅

対応

MD5ハッシュは固定長の128bitのため、16進数変換した場合必ず文字長は32文字になります。そこでフォーマットで0埋めを行うように指定している文字数を、32文字に変更することで対応しました。

// メッセージダイジェストインスタンスを作成
MessageDigest md5 = MessageDigest.getInstance("md5");
// 平文からMD5ハッシュのバイト列を取得
byte[] md5_byte = md5.digest(message.getBytes());
// BigIntegerに変換
BigInteger md5_int = new BigInteger(1, md5_byte);
// BigIntegerから16進数の文字列に変換
- return String.format("%02x", md5_int);
+ return String.format("%032x", md5_int);

おわりに

規約やプロトコル等の形式が定められていることの重要性を知ることができました。利用する対象の形式やルールを確認し、正しく処理を作ることを心掛けていきたいと思います。

Java Development Kit を Windows 11 にインストールしてみた

オープンソースJava Development Kitをインストールする方法の記録です。

初めに

GNU GPL ライセンスであるOpenJDKをWindowsにインストールしようとしたときに何をすればいいか分からなかったため、Microsoft がビルドしたOpenJDKのmsiを使ってインストールを実施しました。

msiファイルのダウンロード

Microsoft Build of OpenJDKのダウンロードページにアクセスします。

learn.microsoft.com

2024年1月時点で最新の長期サポートバージョンであるOpen JDK 21をダウンロードします。

msiのダウンロード

JDKのインストール

ダウンロードしたmsiファイルを起動してセットアップウィザードを起動します。

インストーラーの起動

使用許諾契約書に同意してOKを押します。

利用規約

構成については特に変更する必要はありません。

構成

インストールを開始します。

インストール開始

以下の画面になればインストール完了です。

インストール完了

動作確認

コマンドプロンプトで以下のコマンドを実施します。

java -version

以下のようにバージョンが表示されれば動作確認成功です。

openjdk version "21.0.2" 2024-01-16 LTS

UTM を使って Fedora をインストールしてみた

UTMを使って仮想環境にFedoraをインストールした時の手順記録です。

実行環境やバージョンは以下になります。

  • OS:MacOS Ventura
  • 使用するソフト:UTM ver4.4.5
  • インストールするOS:Fedora Workstation 39

OSイメージとソフトの準備

まずはFedora WorkstationのISOイメージをダウンロードします。

Fedora Workstation | The Fedora Project

以下の赤枠を選択してARM用のイメージをダウンロードします。

ISOイメージのダウンロード

続けてUTMのダウンロードとインストールを行います。

UTM | Virtual machines for Mac

リンク先でUTMのdmgファイルをダウンロードします。

UTMのダウンロード

ディスクマウントを開いてUTMをインストールします。

UTMのインストール

これでOSイメージとソフトの準備は完了です。

環境の作成

次はUTMで環境の作成を行います。先ほどインストールしたUTMを起動し、新規仮想マシン作成をクリックします。

今回はARM用イメージを使用するため仮想化を選択します。

 環境選択

OSではLinuxを選択します。

OSの選択

次のページでは先ほどダウンロードしたFedoraのISOイメージを選択します。

ISOイメージの選択

続けてハードウェアの設定をします。ここでOpenGLアクセラレーションは無効にします。有効にしている場合、起動に失敗します。

ハードウェアの設定

画面の指示に従って ストレージ、共有ディレクトリ、概要を設定し環境の作成は完了です。

OSのインストール

作成した環境を起動してOSのインストールを行います。

環境を起動すると「Display output is not active.」が表示されるので待機します。

しばらくすると次のような画面になるので「Test this media & start Fedora-Workstation-Live 39」を選択します。

ブート画面
 

起動すると次のような画面になるので画面の指示に従ってインストールを行います。

Fedoraのインストール画面

インストール完了後に再起動を行う必要があります。 再起動時はマウントしているISOを解除してから起動する必要があります。

以上でOSのインストールは完了です。

おわりに

UTMを使って仮想環境にFedoraのインストールを行いました。

今回構築した環境を触りながらLinuxについて知っていきたいと思います。

最後に、アプリおよびOS、ディストリビューションに関連するリポジトリ等をメンテナンスしている皆様に感謝いたします。

Krita で krita-ai-diffusion のライブ機能を試す

はじめに

Mac上でオープンソースのペイントソフト「Krita」とStableDiffusionのプラグイン「krita-ai-diffusion」を動かして、ファインチューニングモデルを使った画像生成と、ライブ機能を使った画像生成を行いました。

Kritaの準備

Kritaの準備では、Kritaのダウンロードとインストール、Krita-AI-Diffusionのプラグインの追加を行います。

まずはkritaのページからアプリをダウンロードします。

krita.org

Kritaのダウンロード

ダウンロードしたdmgファイルをダブルクリックしKritaをApplicationsにドラッグアンドドロップします。

Kritaのインストール

KritaのプラグインであるKrita-AI-Diffusionを追加します。

以下のページからkrita-AI-Diffusionのプラグインをダウンロードします。

github.com

Krita-AI-Diffusionのダウンロード

ダウンロードしたプラグインをKritaに追加します。

ツール > スクリプト > Pythonプラグインをファイルからインポートを選択します。

プラグインの追加

ファイル選択画面が表示されるので先ほどダウンロードした「ai-diffusion.zip」を選択します。

続けてプラグインを有効化するため Krita > Prefarense から設定画面を呼び出します。

KritaのPreferences

PythonプラグインマネージャーからAI Image Diffusionを有効化しKritaを再起動します。

AI-Diffusionの有効化

再起動後、新規でドキュメントの作成を行います。画像サイズが大きいと生成に時間がかかるため500x500前後のサイズを指定してください。それ以外の値についてはデフォルト値のままで問題ありません。

初回起動であればウィンドウ内に以下のような「AI-Image-Generation」のパネルが表示されます。

AI-Image-Generationのパネル

表示されない場合は設定 > ドッキングパネル からAI-Image=Generationにチェックをつけます。

AI-Image-Generationの表示

AI-Image-Generationのパネル右上にある歯車マークをクリックして設定を表示します。

設定からAI-Diffusionの環境を構築します。初期設定のままでMacGPUを使う設定になっているため、特に変更することなく「Install」ボタンをクリックすると構築を開始します。

環境のインストール

ファインチューニングモデルの追加

AI-Image-Generationの設定でStyleを開きます。

Model Checkpointのファイルボタンをクリックすることで開くディレクトリに、任意のチェックポイントを追加します。

または、以下のモデルディレクトリを開いて任意のチェックポイントファイルをコピーまたは移動します。

ユーザ/{ユーザ名}/ライブラリ/ApplicationSupport/krita/pykrita/ai_diffusion/.server/ComfyUI/models/checkpoints

Model Checkpointの更新ボタンをクリック後にプルダウンから追加したチェックポイントを選択します。

モデルの追加

画像生成の実行

テキストからの画像の生成を実行します。

画像生成の実行

  1. まずは先ほど追加したモデルの選択をします。

  2. 続けてプロンプトを入力します。

  3. 最後にGenerateボタンをクリックすると画像生成が始まります。

生成が完了するとウィンドウに生成した画像が表示されます。 その中から気に入ったものを選択しApplyをクリックするとキャンバス内に出力されます。

ライブの実行

ライブ機能を使って画像生成を行います。

AI-Image-GenerationからLiveを選択します。

Live生成の起動

プロンプトの入力とモデルの選択後、再生ボタンを押すとライブ生成が始まります。 キャンバスに書いた絵を元に画像が生成されます。適宜加筆、修正を行いイメージ通りの画像が生成されるように調整してください。また、パネル内の「Strength」はプロンプトをどれだけ反映するかを決める値です。小さい値であれば元の絵の特徴が強く残り、大きい値にすることでプロンプトに合わせた生成が行われるようになります。

ある程度形になったら以下のボタンを押すことで現在の状態がレイヤーとして出力されます。

生成画像をレイヤーとして出力

キャンバスへの加筆修正、レイヤーへの出力を繰り返すことで作りたい画像を生成することができます。

最後にUpScalingを実行して完成になります。

最終的な出力

おわりに

Kritaでファインチューニングモデルを使った画像生成と、ライブ機能を使った画像生成を行いました。

ライブ機能を使って画像生成した際は、頭の中で想像した画の輪郭を、AIがどんどんと形にしていく様子に驚きました。また、AIが生成した画の特徴を活かしつつ、自分のイメージに合わせて加筆修正していく作業は、とても楽しかったです。

最後に、アプリおよび関連するリポジトリ等をメンテナンスしている皆様に感謝いたします。

Google ColaboratoryでDDSP-SVC4.0を使った声の変換を行ってみた

はじめに

DDSP-SVCGoogle Colaboratoryで動かした記録です。 Ver3.0で追加された拡散機構を含んだバージョンを試してみました。

Google Driveの準備

まずはGoogleDrive上に必要なファイルを配置していきます。

ディレクトリの準備

  1. Google Driveに「ddsp-svcディレクトリを作成します。

  2. 「ddsp-svc」の下に「pretrain」、「train_data」、「input」、「output」、「diffusion-test」を作成します。以下は作成した後の一例です。

  3. 次のpyhtonノートブックを開いてドライブにコピーします。 Open In Colab

モデルのダウンロード

DDSP-SVCリポジトリから訓練済みモデルをダウンロードします。

github.com

遷移先の以下の項目のContentVec、HuberSoft、NSF-HiFiGan、RMVPEをクリックしてダウンロードします。

2. Configuring the pretrained model

Feature Encoder (choose only one):
(1) Download the pre-trained ContentVec encoder and put it under pretrain/contentvec folder.

(2) Download the pre-trained HubertSoft encoder and put it under pretrain/hubert folder, and then modify the configuration file at the same time.

Vocoder or enhancer:
Download the pre-trained NSF-HiFiGAN vocoder and unzip it into pretrain/ folder.

Pitch extractor:
Download the pre-trained RMVPE extractor and unzip it into pretrain/ folder.

「pretrain」に以下の構成になるようにアップロードします。

また、以下の記載箇所から「model_0.pt」をダウンロードし、diffusion-test内にアップロードします。

(4.0 - Update) New DDSP cascade diffusion model
Installing dependencies, data preparation, configuring the pre-trained encoder (hubert or contentvec ) , pitch extractor (RMVPE) and vocoder (nsf-hifigan) are the same as training a pure DDSP model (See section below).

We provide a pre-trained model here: https://huggingface.co/datasets/ms903/DDSP-SVC-4.0/resolve/main/pre-trained-model/model_0.pt (using 'contentvec768l12' encoder)

Move the model_0.pt to the model export folder specified by the 'expdir' parameter in diffusion-new.yaml, and the program will automatically load the pre-trained model in that folder.

学習用データのアップロード

学習用データを「train_data」にアップロードします。 学習用としてアップロードするデータは[mp3, wav, flac]が利用できます。

変換するデータのアップロード

変換元データとして「input」にアップロードします。 変換元データは[wav]が利用できます。

Colaboratoryの準備

コピーしたノートブックを開いてドライブをマウントします。この時、ランタイムのタイプがGPUになっていることを確認してください。

マウント後にOne-time setupの範囲を実行します。 One-time setupでは必要なコードのcloneと依存ライブラリのインストール、保存が行われます。

! cd DDSP-SVC && sudo python3 -m venv ./venv --without-pip && curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && . ./venv/bin/activate && python3 get-pip.py && pip install --upgrade pip && pip install -r requirements.txt
! tar -zcvf DDSP-SVC.tar.gz DDSP-SVC
! cp DDSP-SVC.tar.gz ./drive/MyDrive/ddsp-svc/ -r

モデルの訓練

モデルの訓練を実施します。

学習済みモデルのコピー

必要な学習済みモデルをGoogleDriveの「pretrain」ディレクトリごとコピーします。

! cp drive/MyDrive/ddsp-svc/pretrain DDSP-SVC/ -r

音声ファイルの準備

音声ファイルを学習用のデータに分割します。 分割対象の音声ファイルはGoogleDriveの「train_data」にある全ての音声ファイルです。

import sys
sys.path.append("./DDSP-SVC/venv/lib/python3.10/site-packages/")
sys.path.append("./DDSP-SVC/")
import separate

separate.separate_audio(input="/content/drive/MyDrive/ddsp-svc/train_data/", output="/content/DDSP-SVC/data/train/audio", silence_thresh=-40, min_silence_len=750, keep_silence=750 , min=2000, max=5000, padding=True)

訓練の実施

モデルの訓練を開始します。

! cd DDSP-SVC && . ./venv/bin/activate && python draw.py && python preprocess.py -c configs/diffusion-new.yaml

! cd DDSP-SVC && . ./venv/bin/activate && python train_diff.py -c configs/diffusion-new.yaml

モデルは2000ステップごとに保存され、古いチェックポイントは削除されます。最大で100000エポックまで学習が継続するため、 回転しているボタンをクリックして適当なステップ数で学習を打ち切ってください。

モデルの保存

モデルの保存を行います。 以下の処理が完了するとGoogleDriveのddsp-svcにmodel.zipが作成されます。

!zip model.zip ./DDSP-SVC/exp/diffusion-test -r

!mv model.zip ./drive/MyDrive/ddsp-svc/

モデルのテスト

以下の処理で音声変換を試すことができます。 inputにあるname.wavを変換し、outputにname.wavとして出力します。

! cd DDSP-SVC && . ./venv/bin/activate && python main_diff.py -i "../drive/MyDrive/ddsp-svc/input/name.wav" -o "../drive/MyDrive/ddsp-svc/output/name.wav" -diff "./exp/diffusion-test/model_10000.pt" -d "cuda"

各引数は以下のように設定してください。

  • -I 変換するファイルのパス name.wavを任意のファイル名に変更してください。
  • -o 出力先のパス name.wavを任意のファイル名に変更してください。
  • -diff 変換に使うモデルのパス model_‘0000.ptの数字を任意の値に変更してください。選択可能なモデルは「./DDSP-SVC/exp/diffusion-test」配下を確認してください。

おわりに

Google ColaboratoryでDDSP-SVCのモデルを訓練しました。前回のバージョンと比較して、より自然な音声に変換できていると感じました。後日、ローカル環境での音声変換の実行方法についても更新を行います。 最後に、関連するリポジトリやコードをメンテナンスしていただいている皆様に感謝いたします。