Hallo,
ich habe ein Neuronales Netz in Matlab gebaut und daraus C++ Code
generiert für meinen Arduino Yun. Testweise hab ich erstmal alle
Funktionen in die Arduino IDE so eingebunden, wie es in der
Beispieldatei vom Matlab Coder zu finden war, dazu hab ich noch ein paar
Nachrichten eingebaut, die über die serielle Schnittstelle verschickt
werden, damit ich sehen kann was der Arduino gerade macht.
Und da ist das Problem, es werden mir die Zahlen bis 3 angezeigt, die 4
fehlt, außerdem leuchtet die Tx LED auf dem Arduino die ganze zeit (die
Rx LED blinkt konstant). Ist der Atmega32u4 mit dem neuronalen Netz
überlastet oder warum kommt er nicht aus der Funtkion in die main
zurück?
Macht es Sinn den Watchdog mal zu aktivieren? Ich hab gelesen, dass es
dann evtl. zu Problemen mit dem bootloader kommen kann??
Ich hab jetzt erstmal nur die main und die NeuralNetwork Funktionen
angehangen, da der Coder jede Menge Funktionen generiert hat, wenn noch
was fehlt würde ich das dann bei Bedarf noch hochladen.
1
void setup() {
2
// put your setup code here, to run once:
3
Serial.begin(19200);
4
5
//while (!SerialUSB); // wait for Serial port to connect.
6
while (!Serial) ;
7
Serial.println("Start:\n");
8
9
NeuralNetwork_initialize();
10
Serial.println("1");
11
}
12
13
void loop() {
14
emxArray_real32_T *data;
15
float activity_data[2];
16
int activity_size[1];
17
float percent;
18
19
int i;
20
Serial.println("2");
21
22
while(1){
23
// Initialize function 'NeuralNetwork' input arguments.
Wieso willst das auf dem arschlahmen Atmel rechnen und nicht auf dem
Linux Prozessor? RAM wird da auch knapp.
Der AR9331 ist wenigstens eine Größenordnung schneller...
float Variablen auf einem Atmega? Auf den 8bit Mikrocontrollen machen
wir alle Arten vor unsauberen Tricks, bevor wir Gleitkommazahlen
benutzen.
Die haben keine Hardware für Gleitkomma. Jede Berechnung braucht
hunderte von Maschinenbefehlen.
Jim M. schrieb:> Wieso willst das auf dem arschlahmen Atmel rechnen
Du weißt doch gar nicht wie schnell es sein soll? Vielleicht reichen ihm
ja ein paar hundert Ergebnisse pro Sekunde vollkommen aus?
> und nicht auf> dem> Linux Prozessor?
Kanonen -> Spatzen?
> RAM wird da auch knapp.
Wie das? Wo soll ein fertig trainiertes NN mit ein paar dutzend
Koeffizienten im Flash irgendwelches nennenswerte RAM verbrauchen?
Bernd K. schrieb:> Jim M. schrieb:>> Wieso willst das auf dem arschlahmen Atmel rechnen>> Du weißt doch gar nicht wie schnell es sein soll? Vielleicht reichen ihm> ja ein paar hundert Ergebnisse pro Sekunde vollkommen aus?
Die Funktion soll ca. 20 mal pro sekunde aufgerufen werden, ist das
machbar für dem Atmega oder lohnt es sich wirklich den linux prozessor
zu verwenden?
Kabolt schrieb:> Wieviel Flash / RAM belegst du laut Ausgabe des Makes?
Der Sketch verwendet 17.168 Bytes (59%) des Programmspeicherplatzes. Das
Maximum sind 28.672 Bytes.
Globale Variablen verwenden 819 Bytes (31%) des dynamischen Speichers,
1.741 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.560
Bytes.
Kabolt schrieb:> Diese Funktion solltest du noch posten: NeuralNetwork.
1
// daten enthält die x,y,z Beschleudnigung und die richtig aktivität die
2
// erkannt werden soll, zurückgegeben wird die erkannte aktivität und die
Hast du diese Code-Wüste selbst geschrieben oder generieren lassen? Im
Ernst: sowas kann man nicht inhaltlich bewerten. Deswegen alternativ:
kompiliere das mal auf dem PC und starte es im Debugger.
name123 schrieb:> Macht es Sinn den Watchdog mal zu aktivieren?
Sicher nicht, denn wenn du ihn nicht zurücksetzt, dann setzt er
deinen uC dauernd zurück...
> Globale Variablen verwenden 819 Bytes (31%) des dynamischen Speichers,
Du meinst vermutlich das oridinäre RAM.
> 1.741 Bytes für lokale Variablen verbleiben.
Ich weiß nicht so recht...
Allein das hier:
> boolean_T s_data[7351];
7351 Bits sind allein schon 918 Bytes. Und wehe, der Compiler verwendet
für ein Boolean ein ganzes Byte...
Und dann kommt noch die wirkliche dynamische Speicherverwaltung über
"emxEnsureCapacity()" dazu. Und das kann der Compiler tatsächlich nicht
vorausberechnen, weil es erst zur Laufzeit passiert.
Wenn ich mir das so ansehe, dann fällt mir nur das linke Bild dazu ein.
The D. schrieb:> Hast du diese Code-Wüste selbst geschrieben oder generieren> lassen? Im> Ernst: sowas kann man nicht inhaltlich bewerten. Deswegen alternativ:> kompiliere das mal auf dem PC und starte es im Debugger.
Der Code wurde aus Matlab Code generiert, deswegen ist es nicht ganze
einfach diesen nachzuvollziehen. Da der Code aber generiert wurde, würde
ich erstmal davon ausgehen, dass dieser korrekt funktioniert. Aber kann
der Arduino so lange dafür brauchen, eine 2x5 Matrix aus float Werten im
NN zu verarbeiten?
Die Arduino IDE hat leider keinen Debugger, wenn es wirklich sein kann,
dass der Atmega das nicht schafft dann muss ich mal schauen ob ich die
ganzen Librarys von Arduino finde und das ganze im Atmel-Studio laufen
lassen.
Hat schonmal jemand versucht eigenen Code auf dem Linux Prozessor vom
Yun laufen zu lassen, hab in der Arduino Doku nicht wirklich was dazu
gefunden, nur das es theoertisch möglich ist?
Lothar M. schrieb:> name123 schrieb:>> Macht es Sinn den Watchdog mal zu aktivieren?> Sicher nicht, denn wenn du ihn nicht zurücksetzt, dann setzt er> deinen uC dauernd zurück...
Ja wenn er resettet wird, weiß ich das es zu viel für den uC ist oder
sehe ich das falsch?
Lothar M. schrieb:>> Globale Variablen verwenden 819 Bytes (31%) des dynamischen Speichers,> Du meinst vermutlich das oridinäre RAM.>> 1.741 Bytes für lokale Variablen verbleiben.> Ich weiß nicht so recht...> Allein das hier:>> boolean_T s_data[7351];> 7351 Bits sind allein schon 918 Bytes. Und wehe, der Compiler verwendet> für ein Boolean ein ganzes Byte...> Und dann kommt noch die wirkliche dynamische Speicherverwaltung über> "emxEnsureCapacity()" dazu. Und das kann der Compiler tatsächlich nicht> vorausberechnen, weil es erst zur Laufzeit passiert
Das ist das was mir die Arduino IDE nach dem programmieren des uC
anzeigt.
der Code soll theoretisch bis zu einer Datensatzlänge von 7351
funktionieren, in static emxArray_real_T *argInit_d7351x5_real_T() wird
diese zum Testen erstmal auf 2 gesetzt, warum in NeuralNetwork trotzdem
jedes mal soviel Speicher blockiert wird. Insgesamt braucht der Sketch
17.200 Bytes, liegen diese komplett im RAM? Laut Datenblatt hat dieser
nur 16 KB!
name123 schrieb:> Ist der Atmega32u4 mit dem neuronalen Netz überlastet
Im Prinzip ja. Floating-Poinnt ist nichts für den. 3-fach geschachtelte
Schleifen schon gar nicht. Schon der Stack-Speicher wird nicht reichen.
Mit dem Programm wird das also nichts.
Es hat schon einen Grund, warum man für neuronale Netze gerne
spezilisierte Prozessoren verwendet.
Dieser Code ist Schrott, einfach mal den Code unten anschauen.
Man kann dann nur hoffen, dass der GCC-Optimierer einige
Nachlässigkeiten des Matlab-Code-Generators ausbügelt.
name123 schrieb:> if (ixstart < 3) {> while (ixstart + 1 < 4) {> if (NNfit->data[i + NNfit->size[0] * ixstart] > mtmp) {> mtmp = NNfit->data[i + NNfit->size[0] * ixstart];> /* dieser Ausruck wird> k = ixstart + 1;> }> ixstart++;> }> }
> Arduino mit neuronalem Netz überlastet?
Probier doch mal im Kopf den Tangens der dritten Wurzel von 4883,0815 zu
berechnen. Dann weißt Du, wie sich der Ardummino gerade fühlt.
Anscheinend ist das neuronale Netz vor dem Rechner auch schon
überlastet.
Es schint es noch was schnelleres dort zu geben, das fähig ist, einen
Browser zu starten (ein PC?) .
Aber das neuronale Netz soll auf dem langsamsten verfügbaren Rechner
laufen.
Gestern war so ein Troll da, der ARM Prozessoren suchte und innerhalb
eines Tages ein Linux portiert hat.
Michael B. schrieb:> Im Prinzip ja. Floating-Poinnt ist nichts für den. 3-fach geschachtelte> Schleifen schon gar nicht. Schon der Stack-Speicher wird nicht reichen.> Mit dem Programm wird das also nichts.>> Es hat schon einen Grund, warum man für neuronale Netze gerne> spezilisierte Prozessoren verwendet.
Danke für die Antwort, dann werde ich mich mal nach geeigneter Hardware
umsehen.
Ist heute schon Freitag?
Würde vorschlagen für das Thema sowohl Matlab als auch Arduino hinter
sich zu lassen. Die coolen Kids spielen gerade mit Tensorflow und
GPU-Accelleration.
name123 schrieb:> Die Funktion soll ca. 20 mal pro sekunde aufgerufen werden, ist das> machbar für dem Atmega oder lohnt es sich wirklich den linux prozessor> zu verwenden?
Da sind tonnenweise Floats drin, das wird so nix auf dem Atmega -
außerdem hat der vermutlich auch vielzuwenig RAM.