集合、帰納法、グラフ、計算の数学的モデル、アルゴリズム、データ、暗号と解説されていて、コンピュータの基礎が数学だったことが思い出されました。アルゴリズムからコンピュータの動作までは良く解っていますが、数学とアルゴリズムの間の繋がりがまだ良く解っていません。数学→計算モデル→アルゴリズムという流れなのか、未だ不明です。
カテゴリー: ニュース
ニュース
AIを作ってみよう09
AI開発で欠かせないのはどのように計算させるかです。あまりにも多くの計算を短時間で実行しなければならないので、その計算能力によって性能が左右されるだけではなく、そのAIの存在自体をも問われます。
コンピュータは計算が得意と言われていますが、その計算の中にも得意不得意があります。例えば桁数がある一定の値よりも大きい数値、乗除算を何度も繰り返す計算、極めて小さい数値等です。なぜこのようなことが起こるかというとコンピュータの中で実際に行われている演算とは論理演算だからです。
論理演算には小数点もなければ桁上がりもありません。計算方法だけ見れば算盤以下です。随分昔ですが算盤の上級者になるとπの算出を暗算でできると聞いたことがあります。論理演算とは電気で計算させるための原始的な方法なのです。
ではなぜコンピュータは計算では人を凌駕できるのか。それは単純な論理演算を一瞬の間に膨大な回数を実行できるからです。2進数の論理演算を組み合わせて10進数の四則演算や難しい関数演算を行える複雑なハードウェアとソフトウェアでコンピュータはできています。
最もコンピュータに向いているのは論理演算なのでそれを基本に計算装置を作ることができれば製造費も電気代も安価な高性能AIができるはずです。
AIを作ってみよう08
AIシステム構築には良くPythonが使われいるようです。Wikiによると「インタープリタ型の高水準汎用プログラミング言語である。」とあるように30年前からあるようですがだいぶ高級な言語のようです。
Pythonもコンパイルしてネイティブ実行ファイルを作ることができますが今はインタープリタ型のプログラムが動作する仕組みを考えてみます。
パソコンでPythonプログラムを実行
↓
Pythonプログラムを読んで実行するプログラム
↓
オペレーティングシステム&デバイスドライバー
↓
ベーシックIOシステム
↓
ハードウェア
Pythonプログラムをハードウェアが実行するまでに何層ものプログラムが動かなければなりません。もし同じプログラムをマイコンで実行するとどうなるでしょうか。
マイコン用プログラム
↓
ハードウェア
マイコン用プログラムであれば直接ハードウェアを実行することができます。もちろん高級言語では簡単なことでもマイコン用プログラムでは大変な労力を必要とすることが多いので単純に比較して優劣を云々できません。しかしAIの中枢は単純な計算の繰り返しなはずです。マイコン用プログラムでもできるに違いありません。
同じ計算でも全体の計算量が大きく違えばその性能差も大変な違いが生まれます。
AIを作ってみよう07
ハードウェアの話が続いたのでここでソフトウェアに話題を切り替えます。AIを構築するためには膨大な計算を処理する装置が必要です。その計算をこなすためには電力が必要です。なぜ計算機は電力を必要とするのか。それは電気の有無を2進数として論理演算を繰り返すため電気がある状態とない状態を何度も何度も繰り返し作らなければならなくなったからです。
であれば使う電力を減らすためには計算の回数が減るようにするのも一つの方法です。性能を上げるためには計算量を増やさなければならない、消費電力を減らすためには計算量を減らなさければならない。矛盾してますね。
電子計算機が生まれたと同時にソフトウェアをどう効率よく製造するかの悩みも双子のように誕生したのです。それから幾十年人類の効率の良いソフトウェア製造方法へのチャレンジは続いています。
プラグ付きケーブルをあっちこっち挿したり抜いたりして作っていたソフトウェアがメモリ内蔵にされるようになった時にマシン語が生まれ、すぐにマシン語と一対になったアセンブラ言語が作られました。この時人類は抽象化された言語でコンピュータと交流できるようになりました。
AIを作ってみよう06
現在世界最速のスパコンの1コアあたりの予算を計算すると
158,976ノード × 52コア = 8,266,752コア
予算1,120億円 ➗ 総コア数8,266,752 = 13,548円
➗ 2.2GHz = 1コア1GHzあたり6,158円
同じ計算を価格コムのデスクトップパソコンの本体だけのモデル価格.com限定 Core i7 に適用すると
予算72,800円 ➗ 8コア ➗ 3GHz =
1コア1GHzあたり3,033円
予算に含まれる項目が異なり比較できる同士ではありませんがこれらの計算力を手に入れという観点で考えれば目安になります。
クロック周波数100MHzあたり300円を目指せばこれらに対抗できるマシンができるかもしれません。
20MHzのクロックで一個50円、5個で250円みたいな計算をしていると夢が広がります。64bitもいらないので8bitか16bitであれば可能性があるかもしれません。更に今のマイコンは低電力に向かっているのでそう遠くない未来に実現できるかもしれません。
マイコンの方が目的にあったハードウェアを構成できるので構築費も電気代も安くなって良いと思います。
パソコンとテンソルフローで何をやっているかわからないAIを作るよりもハードウェアレベルから動作を見ながら構築していく方が未来は広がると思いませんか。
Audacityで波形を表示できるようになったのですが電圧をどう読み取ったら良いかが解りませんでした。オシロスコープの代わりにしようとしているので波形と電圧について調べました。
初めにテスターで測りやすいように正弦波を出力するプログラムを作成しました。
#include <iostream> #include <windows.h> #include <math.h> #include <MMSystem.h> #pragma comment (lib, "winmm.lib") constexpr auto SAMPLING = 192000; constexpr auto CHANNEL = 2; constexpr auto BITSPERSAMPLE = 16; constexpr auto MAXAMP = 32767; int main() { LPWORD lpWave; WAVEHDR whdr; WAVEFORMATEX wfe; HWAVEOUT hWaveOut; wfe.wFormatTag = WAVE_FORMAT_PCM; wfe.nChannels = CHANNEL; wfe.wBitsPerSample = BITSPERSAMPLE; wfe.nBlockAlign = CHANNEL * BITSPERSAMPLE / 8; wfe.nSamplesPerSec = SAMPLING; wfe.nAvgBytesPerSec = wfe.nSamplesPerSec * wfe.nBlockAlign; size_t frequency; DWORD dataLength; DWORD wavelength; DWORD i; std::string str; std::cout << "周波数を入力しEnterで開始します。" << std::endl; std::cin >> str; frequency = std::atoi(str.c_str()); wavelength = (DWORD)SAMPLING / (DWORD)frequency; dataLength = (DWORD)((size_t)CHANNEL * (BITSPERSAMPLE / 8) * wavelength); lpWave = (LPWORD)calloc(sizeof(WORD), dataLength); for (i = 0; i < wavelength; i++) { lpWave[i * 2] = (WORD)(MAXAMP * sin((i * 6.28318530718) / wavelength)); lpWave[i * 2 + 1] = (WORD)(MAXAMP * sin((i * 6.28318530718) / wavelength)); } whdr.dwBufferLength = dataLength; whdr.lpData = (LPSTR)lpWave; whdr.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP; whdr.dwLoops = UINT32_MAX; waveOutOpen(&hWaveOut, 0, &wfe, 0, 0, CALLBACK_NULL); waveOutPrepareHeader(hWaveOut, &whdr, sizeof(WAVEHDR)); waveOutWrite(hWaveOut, &whdr, sizeof(WAVEHDR)); std::cout << "何か入力しEnterで終了します。" << std::endl; std::cin >> str; waveOutReset(hWaveOut); waveOutClose(hWaveOut); free(lpWave); }
このプログラムは入力した周波数の正弦波を左右最大の値で音声出力します。
音量0から10刻みで100まで増やした時の交流電圧です。ピークの算出は√2×1.1をテスターで測った交流電圧値にかけています。使ったテスターの値は多分平均値出力と思いましたので。
音声出力レベル70でピークが±1Vになるようです。
出力側それぞれに4.7KΩの抵抗を並列にして約2.3KΩにしたものを入れて出力値を調整します。
マイクレベル18でピーク±1Vの正弦波をAudacityで表示しました。右側の目盛0.1で1V表示になります。
マイクレベル38でピーク±1Vの正弦波をAudacityで表示しました。右側の目盛0.2で1V表示になります。
可聴範囲に限定ですがデジタルストレージオシロスコープが出来ました。
オペアンプで作った差動増幅器をステレオにし入出力の電圧差が少なくなるように調整しました。
乾電池2本分を入力電圧とします。
手持ちの抵抗を色々取り替えて入出力電圧が同じになるように調整しました。
もう一つのチャンネルも抵抗を取り替えて入出力電圧が同じになるように調整しました。普通のカーボン抵抗でも誤差同士のバランスが合えばそこそこの精度が得られます。安定性には疑問がありますがデジタル信号であればまあいけると思います。
では実際に信号を入れて結果をAudacityで観察します。右が入力信号、左が出力信号です。出力レベル80、入力レベル67でほぼ入力と出力のレベルが同じになりました。
入力信号を拡大した様子です。
出力信号を拡大した様子です。入力の極を入れ替えて反転を無くしほぼ入出力同じにできました。オシロスコープを買わなくても波形が確認できそうです。測定器を買うのではなく用途に合わせて簡易でも作ることができれば勉強にもなり経済的かつ達成感を味わえます。更に問題が起きても解決の糸口を見つけやすくなります。
AIを作ってみよう05
なぜ8ビットマイコンを今更取り上げてAIを作ろうとしているかの経緯を話します。
元々AIには興味を持っていたのですがGPUによる高速演算とテンソンフローの公開により続々と個人ベースで高性能な人工知能システムを完成させている事例を見聞きするにつれ自分もそれに参加したくなったのです。
特にスマホにニューロエンジンと呼ばれる専用ハードウェアが搭載されたことが決定的な出来事でした。
現在スマホのアプリエンジニアとして仕事をしておりいよいよ直ぐそこまでAIが近いてきています。
今後もアプリ開発の現場に留まるためにはAIのスキルも必要と思いました。
西暦2000年前後の頃に汎用ICやPCのグラッフィックボードを使用して低価格で高速計算機を構築する研究結果が出始めその後FPGAを使うなど高性能化が更に進んでいきました。このような背景が第三次AIブームを引き起こした遠因なのでしょう。スーパーコンピュータ並みの計算能力を個人が手に入れることができる時代になったのです。
1995年に完成したGRAPE-4は5Wで243.2GFLOPSを達成したそうです。https://ja.m.wikipedia.org/wiki/濱田剛
個人にとってはその計算機の開発費用もさることながら消費電力も重要な所有の条件です。大容量電力を個人ではとても用意できません。
5Wなら自分でも容易に環境を作ることができます。
AIを作ってみよう04
AIを作ってみよう03
マイクロプロセッサでAIを作るにしても具体的にどうするか決めてからではないと行動できません。ネットで「マイコン」と調べても無数に情報があり的を絞ることができません。
第一条件として予算、高価で揃えられないものを夢みても空論で終わってしまうので費用を第一の条件とします。
第二条件として普及度、今この時にしかないような特殊なものは使わないようにします。過去も有ったし未来も有るだろう、それは汎用品だからというものを第二の条件とします。
この条件に当てはまると思ったのがIntel系の8ビットCPUです。極めて広範囲に普及した為に情報量が多く数十年間様々な分野で君臨しています。これからも廃れることはないでしょう。
このCPUは割と今でも手に入ります。最新のCPUより割高ですが機能が少なく作りが大きいので素人が学習するには良い教材です。秋月であれば100円以下のCPUもありますが基本から技を得るためにヴィンテージCPUを選択しました。
AI開発のアプローチ方法に誤りがある
AIを作ってみよう02
鉄筋コンクリートではゲルマニュームラジオを動かすとができなかったのでトランジスタの力を借ります。
https://www.zea.jp/audio/schematic/sc_file/022.htm
アンテナはベランダに出したビニール線(LANケーブルをばらしたもの)、コイルとバリコンとクリスタルイヤホンはゲルマニュームラジオで使ったもの、ダイオードをやめて高周波増幅に2SC1815を2個ダーリントンにし、低周波増幅も2SC1815を使いました。電源は単3電池2個です。
鳴りました。分離性が悪い為、受信できた放送局は少ないですが確かに鳴りました。円筒型バリコンの内側を引き出せば短波放送も受信できたのです。
実用性がないものですが動くととても楽しいものです。出だし吉と占われたと思いAIが完成するまで頑張ろうと思います。
部品数が十数点の小さな電子回路からの出発ではゴールは見えない遥か彼方です。少しずつ進めていく過程をここで報告致します。
AIを作ってみよう01
マイクロプロセッサーを使いAIを作ってみようと思いMPUをどうしようかと調べていました。当然最初は今流行りのARMを選択するのが普通です。しかし昨今凋落著しい国産半導体の報道に触れていると、できれば国産がいいなとの思いがつのります。この時点でいかにもグローバル化に乗り遅れている感が出てしまっていて恥ずかしい限りですが言い訳は多々思いつくので良しとします。
Tester-TC1 MT-4095
手元には高価では無いデジタルテスター2台とダイソーで買ったハンダゴテしかありません。ヤフオクで色々な機材を揃えるのも大変なので出来るだけ低い周波数の世界でAIを実現することを目標にします。幸いにもMacとWindows PC、iPhoneやらAndroidスマホがあるので結構出来ることは多いと思います。
しばらくぶりに工作するので本番前に練習をしました。幸先を占うためにも何かしら簡単に結果が出るものとしてラジオを作りました。
最も簡単なラジオはゲルマニュウムラジオですが鉄筋コンクリートでは受信できないかもしれません。
コイルはバーアンテナが良く使われますが手持ちも無く買ったとしても他に使い道もないので作ります。自作のアンテナコイルはポリウレタン線やリッツ線で作りますがそれも無いので使わなくなったLANケーブルをバラして厚紙で作ったボックスに巻きつけました。
バリコンはポリバリコンが良く使われますがこれも手持ちがありません。バーアンテナと同じく買ったとしても他に使い道が無いので無駄になってしまいます。
アルミホイルとキッチンペーパーを重ねて丸めます。それを二つ作り片方がもう一方の内側に差し入れることが出来るように若干小さくします。完全に差し込まれている時が2枚のアルミホイル間の静電容量が最大の時で少しづつ抜いていくと静電容量が下がります。立派なバリコンが出来上がります。
ゲルマニュームダイオードとクリスタルイヤホンの自作は100均の材料では無理なので購入しました。
一通り部品が揃ったのでブレッドボードに差し込んでクリスタルイヤホンを耳にしてみましたが雑音すら聞こえませんでした。
予想通りです。
Audacityで波形を表示して自作回路の動作を確認していたのですが、パソコンの音声入力を被計測回路に接続すると動作が変わってしまうので間に挟む装置を作ります。
今まで自作回路の測定点に音声入力端子を直か逆流防止のダイオードを挟んで使用していました。可聴範囲の単純な回路が多かったためそれでも十分でしたが、ROMライターの製作過程でGNDのレベルが異なるようになってから波形とその電圧レベルが知りたくなりました。
オシロスコープを使えばなんのこともないのですが、持っていないので自作することにしました。これも勉強のためです。
表示はパソコンのAudacityでできるので被測定側に影響が出ないように音声入力できれば良いので単純な装置でできると思います。
抵抗値高めの差動増幅器です。被測定回路に影響をなるべく与えないように全て1MΩにしました。使用するオペアンプはuPC741Cです。
1.3Vの単3電池が直列に10本入る電池ボックスを使い真ん中をGNDにします。被測定回路とは別の電源を使った方がより干渉し合わないと思います。
期待通り5本分のマイナス電圧が出ています。
プラス側も5本分の電圧が出ています。
入力に電圧がかかっていない場合は出力も出ていないことが確認できます。
試しに入力側に電池を一つ繋いでみました。
出力側は反転していますが概ね同じような電圧が出ています。若干の誤差は後で調整します。
入力端子の抵抗値を測ります。2MΩもありますので大丈夫そうです。本当はインピーダンスを計りたいのですが器材が無いのでこれでよしとします。
Audacityで入力と出力を表示してみました。左が入力で右が出力です。少し増幅されています。
よく使う信号を入力し拡大した絵です。
出力側は波形が反転していますが十分に使えそうな結果になりました。
Multiplatform2
2 評価
どのプラットフォームを採用すれば良いかはその時々で様々な見解に分かれますが常に念頭に置いておかなければならない観点をまとめます。
2.1 ネイティブ機能へのアクセス方法
それぞれのプラットフォームはアプリを開発出来ると謳っていますが、どこまでネイティブ固有の機能を利用できるか承知した上で利用します。開発していく中で要件を実現できないことになっては大変です。無理してできたとしても予定外のコストが掛かってしまってはそのプロジェクトを成功には導けません。
C\C++
OS自体がC/C++でできているのでネイティブ機能は全て利用できるはずですがそのアクセス方法が利用し易い形でまとまって公開されているわけでもないので難易度が高くまた、直接OSにアクセスするのでメンテナンスが大変です。高速処理が必要なOSに依存しないビジネスロジックをSDKなどの共通ライブラリとして利用するならば良いでしょう。
Flutter
Binding to native code using dart:ffi にあるようにネイティブ機能を呼び出せます。
KMM
Connect to platform-specific APIs にあるようにネイティブ機能を呼び出せます。
Haxe
アプリ開発の具体的な手順があまり載っていませんのでよくわかりません。OpenFL等の高機能なライブラリを利用して実装しC++に変換してからXcodeやAndroidStudioに取り込むのでしょうか?どの程度実用性があるかは試してみないと何とも言えないです。
昔のことですが随分とActionScriptにお世話になりました。だいぶ廃れてきましたがHaxeとOpenFLという形になって生き続けていると思います。実務に活かせるかどうかわかりませんが追い続けていきます。
2023.05.15
まだHaxeは生きているようです。
なので
ChatGPTに聞いてみた。
User
Haxeというアプリ開発環境は知っていますか。
ChatGPT
はい、Haxeはオープンソースのプログラミング言語およびアプリケーション開発フレームワークです。Haxeは、JavaScript、Flash、C++、Java、Python、PHP、C#、Objective-Cなど、さまざまなプラットフォームや言語で実行可能なコードを生成することができます。
Haxeは、静的型付けの言語であり、構造体やジェネリックなどの高度な機能を提供します。Haxeは、クロスプラットフォームの開発をサポートし、複数のターゲットに対してコンパイルできることが特徴です。例えば、Haxeで書かれたコードは、ウェブブラウザやモバイルデバイス上のネイティブアプリ、デスクトップアプリケーション、ゲームエンジン、およびその他のプラットフォーム上で実行できます。
Haxeには、豊富なライブラリやフレームワークが用意されており、それらを利用することで、開発者は簡単に高品質なアプリケーションを作成することができます。また、Haxeは、エディタやIDEのプラグインなど、豊富なツールセットを提供しており、効率的な開発が可能です。
Haxeは、広く利用されているプログラミング言語やフレームワークよりも新しいため、まだ一般的な知名度は高くありませんが、将来的には重要な開発環境の1つになる可能性があります。