日々の開発Tips

「Windowsターミナル」を Windows Server 2022 Datacenter エディションに手軽にインストールする方法

日々の開発Tips

「Windowsターミナル」を Windows Server 2022 Datacenter エディションに手軽にインストールする方法

こんにちは! 本稿はWindows Server 2022 Datacenterエディションに「Windowsターミナル」をインストールする方法のメモです。 ステップバイステップでやるのは少し手間だったので、Powershellにペタっとするだけで自動的にインストールできるよう手順をスクリプト化しました。 管理者権限で開いた Powershell に以下、スクリプトをペタっとすると、後は勝手に「Windowsターミナル」がインストールされます。 (ただしスクリプトの実行結果の保証も責任も負いかねます) なにが手間か 何が手間かというと、Windows Server 2022 では、StoreもApp Installer(winget)もデフォルトではインストールされていないため「Windowsターミナル」をマニュアルでインストールしなければなりませんでした。 そこでペタっとするだけのスクリプト化 管理者権限で開いたPowershellに以下のスクリプトをペタっとすると「Windowsターミナル」が無事インストールされます。 パッケージのダウンロード先には [ユーザ

By Qualiteg プロダクト開発部
PyTorchモデルの最適化~TorchScriptの仕組みと活用法~

NumPy/PyTorch

PyTorchモデルの最適化~TorchScriptの仕組みと活用法~

こんにちは! 本日は PyTorch で開発したAIアプリケーションの本番化に欠かせない、「最適化」についての内容です。具体的には「 TorchScript」 を使用した各種学習モデルの最適化についてみていきたいとおもいます。 TorchScriptの基礎 1 TorchScriptとは TorchScriptは、PyTorchモデルを最適化された中間表現(IR)に変換する技術です。 、、といってもちょっと難しく聞こえるかもしれません。 平易な言葉で言い換えますと、 要するに、PyTorchで作った機械学習モデルを高速かつ多種多様な環境で動作させることをするための技術です。 例えば、、 ・Pythonがインストールされていない環境でも動かせるようにする ・スマホはじめ、各種組み込み機器でも使えるようにする ・動かすときの速度を段違いに上げる ・複数の処理を同時に効率よく実行する などを目論むときは TorchScript がおすすめです。 つまり、TorchScriptは「本番サービス」で使うときにすごく役立ちます。 2 Torc

By Qualiteg プロダクト開発部
【極めればこのテンソル操作 】インプレース操作でメモリ効率化!

NumPy/PyTorch

【極めればこのテンソル操作 】インプレース操作でメモリ効率化!

こんにちは!今日は PyTorchのインプレース操作に関する内容です! ディープラーニングの学習モデルを作ってると、メモリ管理が大きな課題になります。課題の大部分はGPUメモリとお考えの方も多いのではないでしょうか。 そんなときに助けてくれるのが、PyTorchのインプレース操作です! この記事では、インプレース操作の使い方をいろんな角度から見ていきたいとおもいます。 インプレース操作って何? 基本的な考え方 インプレース操作とは、既存のメモリ領域を直接書き換える操作のことです。PyTorchでは、演算子の後ろにアンダースコア(_)をつけることでインプレース操作を実行できます。 つまり、普通の操作だと新しいメモリを確保する必要がありますが、インプレース操作なら既存のメモリを直接書き換えることが可能です。 それでは、実際に見てみましょう! import torch # 普通の操作 x = torch.tensor([1, 2, 3]) y = x + 5 # 新しいメモリが必要 # インプレース操作ならこう! x = torch.tensor([1, 2, 3

By Qualiteg プロダクト開発部
ディープラーニングモデルの安全な並列推論とパフォーマンス最適化

NumPy/PyTorch

ディープラーニングモデルの安全な並列推論とパフォーマンス最適化

こんにちは! 今日は、よく聞かれる質問の1つである「単一のモデルインスタンスで安全に並列推論を行えるか?」に関する内容です! evalモードでの並列推論の安全性 PyTorchモデルがmodel.eval()を使用してevalモードに設定されている場合、一般的に並列推論に対して安全になります。 (ここでいう「並列」はマルチスレッドによる処理ととらえてください。バッチ推論については後述します。) その理由は、 1. パラメータの不変性 evalモードでは、順伝播(forward pass)中にモデルのパラメータが更新されません。 2. 学習特有レイヤーの非活性化 BatchNormなどのレイヤーは、バッチ統計の計算ではなく、実行時統計(running statistics)を使用するモードに切り替わります。 3. 入力データの独立性 各スレッドやプロセスは独自の入力データで動作し、それぞれ別のメモリ領域に存在します。 以下は、evalモードでの安全な並列推論の基本的な例です: import torch import th

By Qualiteg プロダクト開発部
【極めればこのテンソル操作 】NumPy配列の縦マージ方法:5つのアプローチ

NumPy/PyTorch

【極めればこのテンソル操作 】NumPy配列の縦マージ方法:5つのアプローチ

こんにちは! 今日は、NumPyにおける配列の縦マージについてご説明いたします! ご存じの通りNumPyは、Pythonで科学的計算を行うための強力なライブラリです。 複数のNumPy配列を縦にマージして大きな配列を作成する方法について、5つの異なるアプローチを詳しく見ていきましょう。 具体的には、(N,128)と(M,128)の形状を持つ複数のNumPy配列が格納されたPythonのリストから、(N+M,128)の形状を持つ単一のNumPy配列を作成する方法を説明します。 1. np.vstack() を使用する方法 np.vstack() 関数は、垂直方向(行方向)に配列をスタックするための関数です。 import numpy as np list_of_arrays = [ np.random.rand(3, 128), np.random.rand(2, 128) ] merged_array = np.vstack(list_

By Qualiteg プロダクト開発部
GPUメモリ最適化の深層:初回と最終バッチの特殊性を踏まえた効率的なAI画像処理

NumPy/PyTorch

GPUメモリ最適化の深層:初回と最終バッチの特殊性を踏まえた効率的なAI画像処理

はじめに こんにちは!Qualitegプロダクト開発部です。 当社では、LLMテクノロジーをベースとしたAIキャラクター、AIヒューマンの研究開発を行っています。そんな中、表情、仕草のように「人間らしさ」をもったバーチャルヒューマンを再現するときには画像生成、画像編集といったAIを活用した画像処理が必要となります。 人と対話するAIヒューマンやバーチャルヒューマンはタイムリーに表情や仕草を生成する必要があるため、複数の画像をフレーム連結してつくるモーション(シンプルにいうと動画)を短時間に生成する必要があります。 このようなとき、AIトレーニングやシンプルな推論とは異なり、いかにGPUの能力を引き出してやるか「GPUの使いこなし術」がミソとなります。 GPUの使いこなし術というと、以前のブログにも連続バッチやダイナミックバッチについてLLM推論のコンテクストで語りましたが、本日は画像処理におけるGPUメモリ最適化、とくに、推論時バッチにおける「初回と最終回」のお作法という少しマニアックな話題について語ってみようとおもいます。 画像処理とGPU GPUを用いた画像

By Qualiteg プロダクト開発部
【極めればこのテンソル操作 】tensor.unsqueeze(0)と array[None] の違い

NumPy/PyTorch

【極めればこのテンソル操作 】tensor.unsqueeze(0)と array[None] の違い

今日は、 unsqueeze(0) の解説しつつ、私たちがよく直面する「あるある」な問題についてもちょこっと話してみたいと思います。 「value.unsqueeze(0)」と「value[None]」 の見分けついていますか? はい、前者は主に PyTorch、後者は NumPyでの操作の違いです。 でもどちらも、ぱっとみは、先頭に新しく次元を追加する操作なので、コードをちらっとみただけではわからないことがありますよね。 なぜかというと、ディープラーニング系のプログラミングでは PyTorchのテンソルと、NumPyの配列操作がかなり入り混じるからです。 そう、今日の話題はPyTorchとNumPyのコードが入り乱れて、どっちの配列(テンソル)を扱っているのわけワカメになる問題です。 ちなみに、話題のテーマをブラさないように PyTorchでは 先頭に新しい次元を追加するときに unsqueeze(0) だけでなく [None] も使えてしまいますが、いったん[None]は NumPy で主に使用する操作という前提で説明させてくださいませ。^^; これに対する当

By Qualiteg プロダクト開発部
【極めればこのテンソル操作 】reshape(N,-1)

NumPy/PyTorch

【極めればこのテンソル操作 】reshape(N,-1)

NumPy reshape: データ形状を自在に操る方法 NumPyのreshape関数は、多次元配列の形状を変更する強力なツールです。この記事では、reshapeの基本的な使い方から応用まで、具体例を交えて詳しく解説します。 1. reshape の基本 reshapeは、配列の要素数を変えずに形状を変更します。 import numpy as np # 1次元配列を作成 arr = np.array([1, 2, 3, 4, 5, 6]) print("Original array:", arr) print("Shape:", arr.shape) # 2x3の2次元配列に変形 reshaped = arr.reshape(2, 3) print("\nReshaped to 2x3:

By Qualiteg プロダクト開発部
【極めればこのテンソル操作】permute(1,0)

NumPy/PyTorch

【極めればこのテンソル操作】permute(1,0)

本記事はPyTorch,NumPy でよくつかうテンソル操作を、頭でしっかりイメージできるようにするための機械学習エンジニア初心者向けシリーズです! 「厳密な正しさ」をもとめるリファレンス的なものではなく、現場でつかうソースコードに頻出するコードで覚えていきましょう。 今日は permute (1,0) permute操作は、テンソルの次元の順序を変更するためによく使用されます。permuteメソッドの引数は、並び替えの順番を指定します。 permute(1,0)は2次元のテンソルにおいては、「転置」テンソルを作る役割を果たします。なぜそうなのか、順を追ってみていきましょう! それでは早速以下のような 2×3 なテンソルを考えてみましょう このテンソルは2次元なので、表で表現できますね。 このとき、このテンソルは PyTorchでは以下のように定義できます。 import torch x = torch.tensor([[1, 2, 3], [4, 5, 6]]) このテンソルの「形状」は、上でもかいたとおり 2 × 3 です

By Qualiteg プロダクト開発部
RuntimeError: implement_array_function method already has a docstring というエラーが発生したとき

日々の開発Tips

RuntimeError: implement_array_function method already has a docstring というエラーが発生したとき

以下のようなエラーが発生したとき、 RuntimeError: implement_array_function method already has a docstring このエラーメッセージは、numpyパッケージ内で発生している問題のようです。 特に、implement_array_functionメソッドに既にドキュメンテーションが存在しているというエラーで、これは通常、互換性のないバージョンのnumpyを使用している場合に発生するようです。 次の対策でエラーは発生しなくなりました pip install numpy==1.19.5

By Qualiteg プロダクト開発部
AttributeError: module 'torch._dynamo' has no attribute 'mark_static_address' が発生したときの対処法

日々の開発Tips

AttributeError: module 'torch._dynamo' has no attribute 'mark_static_address' が発生したときの対処法

以下のようなエラーが出た場合の対処法 File "/venv/Lib/site-packages/torch/utils/_contextlib.py", line 115, in decorate_context return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/venv/Lib/site-packages/transformers/generation/utils.py", line 1744, in generate model_kwargs["past_key_values"] = self._get_cache( ^^^^^^^^^^^^^^^^ File "/venv/Lib/site-packages/transformers/

By Qualiteg プロダクト開発部
NVIDIA GPU と Capability Level

日々の開発Tips

NVIDIA GPU と Capability Level

NVIDIA GPU の Capability Level の一覧です。 推論エンジンがサポートする各種アクセラレーション機能は Capability Level により搭載されるハードウェアアクセラレータや専用機能が異なります。 データセンター/プロ向けGPU GeForce GPU Capability Level 世代名 NVIDIA B200 - 100 Blackwell NVIDIA B100 - 100 Blackwell NVIDIA H200 - 90 Hopper NVIDIA H100 - 90 Hopper NVIDIA L4 - 89 Ada Lovelace NVIDIA L40 - 89 Ada Lovelace RTX

By Qualiteg プロダクト開発部
【GPT4o対応】OpenAI API のPythonサンプルコードと出力例

日々の開発Tips

【GPT4o対応】OpenAI API のPythonサンプルコードと出力例

今回は、OpenAI の API 利用サンプルコードをご紹介します。 OpenAI API は OpenAI純正のAPI のみならず、vLLMなど他の推論エンジンでも OpenAI 準拠のAPIサーバーが公開されており、LLMサービングAPIのデファクトとなりつつありますので、コーディングのお作法をおさえておきましょう。 OpenAI の GPT シリーズのAPIにアクセスするための、シンプルなサンプルコードは以下のようになります。生成結果をストリーミングで逐次受信してみましょう。 サンプルコード:クイックスタート import asyncio import os import traceback from openai import AsyncOpenAI async def main() -> None: try: # モデル名を指定 # model="gpt-4-turbo" # $10.00/MTok for input

By Qualiteg プロダクト開発部
推論時torch.tensor(sourceTensor)ではなくて、sourceTensor.clone().detach()を使おう

NumPy/PyTorch

推論時torch.tensor(sourceTensor)ではなくて、sourceTensor.clone().detach()を使おう

PyTorchのテンソル操作最適化: 警告メッセージの理解と解決 こんにちは! Qualiteg プロダクト開発部です。 PyTorch 1.13にて、次のような警告メッセージに遭遇しました UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor). この記事では、この警告の意味を解説し、修正方針についてかきたいとおもいます。 torch.tensor() よりも .clone().detach() のほうがおすすめなのか それは、PyTorchがテンソルと自動微分(オートグラッド)をどのように扱うかに関係があります。 torch.

By Qualiteg プロダクト開発部
TensorRT-LLM v 0.11.0.dev2024051400 の動作確認

日々の開発Tips

TensorRT-LLM v 0.11.0.dev2024051400 の動作確認

こんにちは、株式会社 Qualiteg プロダクト開発部です! TensorRT-LLM は FasterTransformerの後継ともいえるNVIDIA製 推論エンジンで、当社ChatStreamの推論エンジンとしても選択可能です。 vLLMと同じく新しいモデル対応が早く、既存モデルも豊富にサポートされています。 昨日 大型コミットが入りましたので動作確認をしました。(マルチモーダルモデルNeva,Kosmos2に対応など。) TensorRT-LLM のサポートしている、モデルアーキテクチャは以下のとおりです。 LLM Baichuan, BART, BERT, Blip2, BLOOM, ChatGLM, DBRX, FairSeq NMT, Falcon, Flan-T5, Gemma, GPT, GPT-J, GPT-Nemo, GPT-NeoX, InternLM, LLaMA, LLaMA-v2, Mamba, mBART, Mistral, MPT, mT5, OPT, Phi-1.5/Phi-2, Qwen, Qwen-VL, Replit

By Qualiteg プロダクト開発部
[ChatStream] 入出力プロンプトの予期せぬ変更に備え revision は固定する

日々の開発Tips

[ChatStream] 入出力プロンプトの予期せぬ変更に備え revision は固定する

こんにちは。(株) Qualiteg プロダクト開発部です。 GW中に、microsoft/Phi-3-mini-128k-instruct の tokenizer.json が変更になり、プロンプトのパースに失敗し、チャットのストリーミングができなくなる問題が発生しました。 実際には以下の変更がありました https://huggingface.co/microsoft/Phi-3-mini-128k-instruct/commit/8a362e755d2faf8cec2bf98850ce2216023d178a もともと、Miscrosoft さんが書いていた記事にあるプロンプトフォーマットと実際のモデルのプロンプトフォーマットが異なっていたため、当社では、実際のモデルにあわせるヒューリスティックな対応をしておりましたが、モデル(\w tokenizer) 側がもとの仕様に近い形に修正してきた模様です。 これによって、当初動作していたプロンプト変換器が動作しなくなるという現象が発生しました。 LLM は「スピードが命!」なので、トークナイザー含め完全にテストされた状態

By Qualiteg プロダクト開発部