Vor ungefähr 3 Jahren [Ergebnis der Entwicklung eines Aktienkurs-Prognoseprogramms für maschinelles Lernen durch mich als WEB-Shop \ | Masamunet](http://masamunet.com/2016/11/09/web%E5%B1%8B%E3%81 % AE% E8% 87% AA% E5% 88% 86% E3% 81% 8C% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92% E6% A0% AA % E4% BE% A1% E4% BA% 88% E6% 83% B3% E3% 83% 97% E3% 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% A0% E3 % 82% 92% E9% 96% 8B% E7% 99% BA /) Ich habe einen Artikel geschrieben und nicht viel mit maschinellem Lernen oder Aktien gemacht, aber dieses Jahr und Neujahr habe ich den Sprung gewagt. Ich habe verschiedene Dinge ausprobiert. Deshalb habe ich ein ziemlich gutes Ergebnis erzielt, deshalb werde ich über den technischen Hintergrund schreiben, der dazu geführt hat, dass der Betrieb als Service so ist, wie er ist. Der Link zum Dienst selbst ist ein kostenpflichtiger Dienst. Wenn Sie ihn also aus religiösen Gründen verknüpfen, können einige Leute ihn möglicherweise nicht sehen, daher werde ich ihn hier nicht einfügen. Persönlich denke ich, dass es wichtig ist, ein System zu schaffen, mit dem Ingenieure angemessen Geld verdienen können, aber mit anderen Worten, ich denke, es wäre schön, wenn wir Dienstleistungen, die erbracht werden können, auch dann unterstützen könnten, wenn sie bezahlt werden. Es ist kein Ort, um solche Dinge hier zu diskutieren, daher werde ich sowieso davon absehen, den Dienst selbst zu verlinken. Ich denke jedoch, dass es Meinungen gibt, die Sie nicht beurteilen können, ohne den tatsächlichen Service zu sehen. Daher möchte ich am Ende des Artikels einen Link einfügen, der Sie zum Service führt, wenn Sie ihm leicht folgen. .. Soviel zur Einführung, ich werde die endgültige Struktur vorstellen.
Kurz gesagt, ich möchte zu dem Artikel sagen, dass Docker kompatibel war, als ich versuchte, ihn zu einem WEB-Dienst zu machen, damit er weit verbreitet werden kann, weil die Ergebnisse des maschinellen Lernens gut waren. Deshalb möchte ich ihn vorstellen.
Ich verwende auf der ganzen Linie verschiedene Technologien, aber alle verwenden nur die Grundlagen, sodass ich keine detaillierte Erklärung für notwendig halte. Ich mache mir jedoch Sorgen, dass ich mit der Geschichte mit dem Text "Ich kenne dich" fortfahren werde, daher werde ich ein wenig über die Erklärung jeder Technologie sprechen.
Ich muss die Geschichte über Docker hier nicht mehr erklären, aber selbst wenn ich die Erklärung weglasse, wird die Geschichte nicht fortgesetzt, so dass ich nur den oberflächlichen Teil ohne Angst vor Missverständnissen einführen werde. .. Docker zeichnet sich durch zwei Merkmale aus: Virtualisierung mit geringem Overhead und Containerisierung einer frei stapelbaren Umgebung. Denken Sie an diese beiden, Virtualisierung und Containerisierung. Die Technologie der Containervirtualisierung gab es bereits vor Docker, und Docker hat in der Vergangenheit auch eine externe Containervirtualisierungsbibliothek in Versionen vor 0.9 verwendet, sodass nur Docker ausschließlich für die Containervirtualisierung vorgesehen ist. Obwohl es sich nicht um ein Patent handelt, wird die Master-Slave-Beziehung hergestellt, bei der Docker die Container-Virtualisierung als Hauptmerkmal verwendet. Erstens Virtualisierung. Der größte Teil der herkömmlichen Virtualisierung außer der Containervirtualisierung verwendet die Idee einer virtuellen Maschine und versucht, alles von der CPU aus virtuell vorzubereiten. Es war eine Technologie, die sich so verhielt, als gäbe es eine Maschine für die Ausführungsumgebung (auch als Gastumgebung bezeichnet). Zu diesem Zeitpunkt virtualisierte Docker die Dateieingaben und -ausgaben. Durch die Steuerung des Lese- / Schreibteils der Datei und das Verhalten, als gäbe es dort einen dedizierten Computer, wurde die Ausführungsumgebung getrennt. Dies schafft weniger Overhead. Als nächstes containerisieren. Dies bedeutet, dass Sie beim Ausschalten des Geräts bis zu diesem Punkt zurückspulen und den Rückspulpunkt frei einstellen können. Stellen Sie sich einen PC vor, auf dem Sie in einem sauberen Windows einmal einen Rücklaufpunkt ausführen und das frisch installierte Windows jedes Mal startet, wenn Sie das Gerät ausschalten. Angenommen, Sie haben auch einen Rückspulpunkt mit installiertem Solitaire erstellt, da dieser ineffizient wäre. Das erste Windows, das Windows mit installiertem Solitaire und die zweite Containerebene in Docker wurden gestapelt. Als nächstes möchte ich Netscape Navigator 4 installieren. Sie können es unter einem sauberen Windows oder in der Umgebung installieren, in der Solitaire installiert ist. Sie können auswählen, welche Umgebung hinzugefügt werden soll. Dies ist ein Stapel von Docker-Containern. Der bequeme Punkt bei der Containerisierung besteht darin, dass Sie das, was Sie benötigen, beliebig frei stapeln und beim Ausschalten wiederherstellen können. Virtualisierung mit weniger Overhead und Containerisierung, mit der Sie eine kostenlose Umgebung erstellen und jederzeit zurückgeben können. Das ist das Schöne an Docker. Dieses Mal werden wir diese Technologie voll ausnutzen.
Ich habe mit dieser Konfiguration fortgefahren.
Beim maschinellen Lernen werden Daten gesammelt, vorhergesagt, berechnet, basierend auf den Ergebnissen verifiziert und dann vorhergesagt und wiederholt, sodass die Datenerfassung und das maschinelle Lernen während der Entwicklung unvermeidlich sind. Ich wiederhole es oft. Von Anfang an kann es schwierig sein, die Veröffentlichung als Service zu gestalten. Wenn ich es also nur so entworfen habe, dass jeder Vorgang für jeden Ordner getrennt wurde, war es einfach, eine API zu erstellen, indem Flask anschließend nur den Teil für maschinelles Lernen verwendet. Wenn Sie nach und nach anfangen zu glauben, dass Sie es als Service veröffentlichen können, während Sie das maschinelle Lernen wiederholen, ist es später einfacher, es so zu machen, wie es später bei Flask der Fall ist, wenn Sie es zu einer Funktion machen, während Sie sich des Eingangs der API bewusst sind. ist. Darüber hinaus kann das später beschriebene Backend separat erstellt werden, sodass Flask später lokal im Docker-Netzwerk geschlossen werden kann. Es ist auch praktisch, dass die API-Seite hier nur eine minimale Desinfektion und Validierung erfordert. Natürlich müssen Sie vorsichtig sein mit Schwachstellen, die den Host von der Gastseite von Docker übernehmen können, aber da Sie Daten als authentifiziert austauschen können, tun Sie hier ** fast ** nichts Daten ohne sie übertragen zu können, ist ein großer Vorteil. Wiederum ist fast nichts eine Geschichte mit minimaler Desinfektion, Validierung und Zertifizierung. Bitte beachten Sie, dass es darum geht, SQL mit Platzhaltern auszuführen, nichts mit Root-Rechten auszuführen und zumindest normale Dinge zu tun. Die Definition des Normalen ist wichtig, aber die Geschichte ist zu weit verbreitet. Lassen Sie mich sie daher weglassen.
Als Referenz werde ich den Code veröffentlichen, der tatsächlich ausgeführt wird. Der Code ist schlampig, aber wenn Sie mit dem schlampigen Code bescheiden sind, geht die Geschichte nicht weiter, also fahren wir fort. Was ich sagen möchte ist, dass Sie, wenn Sie es in einem ordnungsgemäß geschlossenen Zustand verwalten können, den Code bedienen können, indem Sie ihn einfach so bis zur Produktion übergeben.
service.py
# %%
@app.route('/')
def index():
return jsonify({
'status':200,
'data': {}
})
# %%
@app.route('/count')
def count():
return jsonify({
'status':200,
'data': search_stock.get_last_data_count()
})
# %%
@app.route('/last-date')
def last_date():
return jsonify({
'status': 200,
'data': search_stock.get_last_date()
})
# %%
@app.route('/getstock/<code>')
def getstock(code):
low = int(request.args.get('low'))
high = int(request.args.get('high'))
isStockExist = search_stock.get_stock_name(code)
if isStockExist is None or isStockExist is '':
message = '{0} is not found'.format(code)
return jsonify({'message': 'error'}), 500
data = search_stock.get_stock_list(low, high, code)
return jsonify({
'status': 200,
'data': data
})
# %%
@app.route('/getresemble/<code>', methods=['POST'])
def get_resemble(code):
data = request.get_data()
json_data = json.loads(data)
stock_list = json_data['list']
isStockExist = search_stock.get_stock_name(code)
if isStockExist is None or isStockExist is '':
message = '{0} is not found'.format(code)
return jsonify({'message': 'error'}), 500
result = get_stock.start(code, stock_list)
return jsonify({
'status': 200,
'data': result,
})
# %%
if __name__ == "__main__":
app.run(host='0.0.0.0',port=5000,debug=True)
Ich denke nicht, dass es in Ordnung ist, alles in einen Docker-Container zu verwandeln, aber ich habe die Daten auch in einen Docker-Container verwandelt. Ursprünglich sollte der Datenteil als externes Volume von Docker bereitgestellt werden. Wie viele von Ihnen jedoch wissen, benötigen Sie Root-Berechtigungen auf der Host-Seite, wenn Sie versuchen, ein Host-Volume von Docker unter Linux bereitzustellen. Die einzige Lösung besteht darin, etwas gegen die Docker-Containerseite oder die Docker-Hostseite zu unternehmen. In meinem Fall wird jedoch ein Gitlab-Runner-Benutzer auf Gitlabs CI / CD ausgeführt. Es gibt eine Umgebung, in der der Gitlab-Runner von sudo ausgeführt wird, dh die Situation des Benutzers ist je nach Betriebsumgebung unterschiedlich, daher habe ich ihn gehorsam in Docker gesperrt. Das Gute daran, es hier zu einem Docker-Container zu machen, ist, dass auch die Portabilität der Daten gestiegen ist. Daher haben wir zusammen mit dem folgenden Scraping-Teil eine leistungsstarke Scraping-Umgebung erstellt. Als Referenz werde ich die Docker-Datei des Datenteils vorstellen.
FROM busybox
WORKDIR /data
COPY . ./
VOLUME [ "/data" ]
Das Schöne an SQLite ist, dass Sie die gesamte DB-Umgebung mitnehmen können, solange Sie die Dateien sperren. Als Tabellendesign für Aktienkursdaten gibt es auch Probleme, z. B. ob die Tabelle für jede Ausgabe aufgeteilt oder der Ausgabecode wie der GROUP BY-Code in einer Tabelle ausgeführt werden soll, aber alle haben gute und schlechte Punkte. Es ist schwer zu befestigen. Dieses Mal habe ich versucht, es mit einer Datenbank einer Marke zu betreiben. Um auf den Markencode 1234 zuzugreifen, greifen Sie auf die Datenbank des Markencodes 1234 zu. Der Zugriff auf die Aktien auf breiter Front erfordert ein wenig Aufwand, aber das ist auch gut und schlecht, also habe ich es diesmal getan. Ich möchte ausführlicher über das Gute und Schlechte des DB-Designs der Aktienkurse sprechen, wenn sich eine Gelegenheit ergibt.
Der Nachteil des Betriebs der gesamten SQLite-Datei mit einem Docker-Image besteht darin, dass Sie das Image jedes Mal neu erstellen müssen, wenn Sie die Daten aktualisieren. Wenn Sie also die CI / CD-Umgebung nicht gut verwalten, sammeln sich die Images immer mehr an. Die Portabilität ist nicht so hoch, da es von der Art des Benutzers abhängt, ob Docker-in-Docker (DinD) zugelassen werden soll oder nicht. Wenn DinD jedoch nicht verwendet wird, sollten die Daten in der Shell aktualisiert werden. Dies liegt daran, dass schließlich die Ausführungsumgebung ausgewählt ist. Wenn Ihnen das nicht gefällt, haben Sie keine andere Wahl, als tiefer in die DinD-Umgebung einzutauchen. Wenn Sie jedoch in Zukunft optimiertes DinD in die Produktionsumgebung bringen möchten, ist es besser, es unter der Shell-Umgebung zu stabilisieren, selbst unter Kubernetes Es ist schneller, es mit RDBMS neu zu erstellen, und es gibt viele Teile, die berücksichtigt werden müssen. Aus einer sehr persönlichen Sicht hat DinD einen historischen Hintergrund, der ursprünglich ziemlich unerwartet verwendet wurde, obwohl er vom Docker-Beamten unterstützt wurde, und DonD ist eine Operation, die zu einer Sicherheitslücke des Host-Betriebssystems werden könnte, wenn sie nicht gut ist. Es ist schwer zu sagen, dass die Umgebung von DinD bereit ist, z. B. um dies zu tun. Deshalb versuche ich, die Docker-Datei so weit wie möglich von der Shell aus zu berühren. Es besteht kein Zweifel, dass es sich um eine sehr bequeme und leistungsstarke Technologie handelt, daher sind die Erwartungen sehr hoch. Ich gab vor, diese Dinge nicht kurz zu betrachten, und dachte vorerst, als ich dem Verschieben Vorrang einräumte, dass das Erstellen eines ganzen Bildes mit SQLite eine Option sein könnte.
Da es sich bei den diesmal verarbeiteten Daten um Aktienkurse handelt, hatte die Verbesserung der Portabilität der Scraping-Umgebung oberste Priorität. Ich möchte immer die neuesten Daten kratzen, deshalb habe ich mich zunächst ohne zu zögern für den Docker-Container entschieden. Dies ist sehr praktisch, da Sie bis zu diesem Punkt automatisieren können, ohne an irgendetwas zu denken, kratzen, wenn der Container startet, und den gesamten Container fallen lassen, wenn er fertig ist. Sie können dies wie bei crontab verwenden oder einfach EC2 erstellen, wenn die Zeit gekommen ist, den Container automatisch starten, wenn die EC2-Seite beginnt, und EC2 für jeden Container beenden, wenn das Schaben abgeschlossen ist. Es war alles gut, aber am Ende habe ich zwei Hauptteile des Scraping-Teils vorbereitet, einen, der von Docker ausgeführt werden kann, und einen, der direkt von der Shell ausgeführt werden kann. Dies liegt daran, dass Docker nicht in allen Umgebungen praktisch war. Schließlich kann das Problem, dass das von Docker bereitgestellte host-seitige Volume im Root-Besitz wird, auch hier nicht vermieden werden, und in einer solchen Umgebung war es besser, es in der host-seitigen Shell auszuführen. Daher haben wir es möglich gemacht, drei Arten von Umgebungen vorzubereiten, z. B. wenn sie direkt in der Shell ausgeführt werden können, wenn die Python-Ausführungsumgebung von Docker abgedeckt wird und wenn die Scraping-Umgebung im Docker-Container ausgeführt wird.
Es ist eine Verschwendung, dieses Produkt im Verlauf des maschinellen Lernens nur zu Ihrem eigenen zu machen. Bitte veröffentlichen Sie es im WEB und lassen Sie es von allen in großem Umfang verwenden! Der nächste Schritt ist dann die Front-End-Entwicklung. Als Leitfaden, wenn ich persönlich ein Framework auswähle, tendiere ich dazu, ein Backend-Framework wie Laravel zu wählen, wenn die Backend-Entwicklung schwer ist, und ansonsten ein Frontend-Framework, soweit dies möglich ist. Abhängig vom Projekt kann es natürlich zu Einschränkungen bei den Servern kommen, die betrieben werden können. Dies ist also nicht der Fall. Wenn Sie jedoch frei wählen können, versuchen Sie, so viel wie möglich vom Front-End aus zu erstellen. Auch hier ist der komplizierteste Teil des maschinellen Lernens bereits abgeschlossen, daher habe ich mich ohne zu zögern für die Express.js + NuxtJS-Konfiguration entschieden, da ich keine kompliziertere Backend-Verarbeitung benötigte.
Auch hier möchte ich nicht sagen, dass es sicher ist, weil es geschlossen ist. Dies ist jedoch der einzige Teil, der in der Tabelle zu sehen ist, und es gibt keine Möglichkeit zu wissen, was im Inneren vor sich geht, es sei denn, Sie wenden eine andere Methode an, z. B. das Hacken aus dem Kernel. Ich denke, je erfahrener Ingenieure sind, desto einfacher ist das Design.
Ich denke nicht, dass es gut ist, alles in einen Docker-Container zu verwandeln, aber am Ende habe ich es auch in einen Docker-Container gemacht. Es werden hier viele Versuche und Fehler entwickelt, daher möchte ich keine Dinge wie Containerisieren und Starten, Überprüfen von Protokollen im Container usw. ausführen, insbesondere nicht den Teil, in dem die Ausführungsumgebung in der Domäne festgelegt ist, Knoten auf der Hostseite Ich konnte es nicht mit .js beginnen, oder es war der Teil, der bis zum Ende gepackt war. Aber am Ende habe ich auch alles in einem Docker-Container eingeschlossen. Der Grund dafür ist, dass es bei der Interaktion mit dem Backend leicht ist, von der Netzwerkumgebung beeinflusst zu werden. Daher fand ich es bequemer, es vollständig im Docker-Netzwerk zu belassen. Am Ende öffnete Docker nur die https- und http-Ports 443 und 80, und der Rest wurde für die Kommunikation innerhalb des Docker-Netzwerks bereitgestellt.
AmazonPay Dies war der schwierigste Teil, und Amazon stellte mir höfliche japanische Erklärungen und SDKs für verschiedene Sprachen zur Verfügung, sodass meine Fähigkeiten nicht ausreichten, aber ich verbrachte viel Zeit damit, sie zu entwickeln. .. Obwohl das SDK in verschiedenen Sprachen verfügbar ist, gibt es für Node.js niemanden. Daher dauerte es einige Zeit, bis versucht wurde, direkt von Express.js aus zu kommunizieren. Ich wollte versuchen, mit Axios direkt mit der API zu interagieren, aber vielleicht habe ich nicht danach gesucht. Ich konnte nur ein einfaches Beispiel für die direkte Kommunikation mit der API finden, und es dauerte enorm lange, bis ich durch Ausprobieren die richtige Antwort gefunden hatte. Ich benutzte. Da AmazpnPay nur die Kommunikation von https unter der vorregistrierten Domain akzeptiert, führen Sie diese zu diesem Zeitpunkt in den Entwicklungszweig ein, um eine Konsole hinzuzufügen. Log → git lab-Runner wird ausgeführt Warten Sie auf Docker-Containerisierung → Docker Nach dem Start wusste ich, dass dies nicht sehr realistisch war, da ich die Funktionsprüfung mit dem Browser wiederholen musste → das Protokoll des Betriebscontainers mit Docker-Protokollen des SSH-Servers anzeigen. Ich werde vielleicht in Zukunft einen besseren Weg finden, aber das einzige, was ich mit dem aktuellen Ablauf tun kann, ist, eine API zu erstellen, die die API mit dem bereitgestellten SDK trifft. Deshalb habe ich dieses Mal das Python-SDK ausgewählt. Das Frontend hatte auch ein wenig Probleme. Da das Design auf der gleichen Annahme basiert, dass die Lade- und Zeichnungszeiten gleich sind, ist es nicht möglich, nur das Modul im Voraus zu laden und die Benutzeroberfläche zum Zeichnungszeitpunkt zu generieren. Da der Lebenszyklus des Verwerfens des Moduls → Generieren nicht berücksichtigt wird, ist es außerdem äußerst schwierig, es jedes Mal neu zu laden, wenn es gezeichnet wird. Daher habe ich es in gewissem Maße mithilfe des Lebenszyklus von Vue.js angepasst. Es war eine etwas unangenehme Implementierung, weil es nicht das Verhalten war, das der Schöpfer der Sache erwartet hatte. Dies ist fatal für die Zahlungsschaltfläche, bei der sich der Betrachter nach Belieben zwischen den Warenkorbbildschirmen hin und her bewegt. Die einzige Möglichkeit zum Neuzeichnen besteht darin, sie neu zu laden. Die Benutzerfreundlichkeit dieses Erstellers besteht darin, dass die Amazon Pay-Schaltfläche zumindest der Notizblock beibehalten wird Vor 4 Jahren, als es fertig war, muss ich sagen, dass das Design alt ist. Ich habe mich gerade beschwert, aber ich denke, es ist ein Zahlungsdienst mit großem Potenzial, daher würde ich mir wirklich Verbesserungen wünschen.
Dieses Mal wurden alle unerwartet im Docker-Container betrieben, aber ich war der Meinung, dass die Methode zum Erstellen des Containers, ohne zuerst darüber nachzudenken und dann den Container zu entwerfen, sehr gut mit dem Service des maschinellen Lernens kompatibel ist. Es war. Da es sich um einen Container handelt, kann es bei der zukünftigen Skalierung des Dienstes leicht sein, ihn mit Kubernetes einzuführen, und ich denke, er wird große Fortschritte machen. Dieses Mal haben wir verschiedene Technologien auf der ganzen Linie eingeführt, aber alle berühren nur die Grundlagen, sodass es je nach Sichtweise möglicherweise nicht ausreicht. Diejenigen, die verrückt nach maschinellem Lernen sind, wissen möglicherweise nicht, wie sie mit Docker einfach bereitgestellt werden können, und diejenigen, die verrückt nach Nuxt.js sind, finden möglicherweise eine gute Möglichkeit, maschinelles Lernen zu verwenden. Ich hoffe, dass die Aufzeichnung der Technologie, die auf der ganzen Linie eingeführt wurde, Ihnen einige Hinweise geben wird. Ich habe diesmal nicht auf die Methode des maschinellen Lernens selbst eingegangen, sondern den Artikel hier darüber, wie man mit Aktienkursen beim maschinellen Lernen umgeht. Es wird separat geschrieben. Wenn Sie möchten, beziehen Sie sich bitte auch darauf.
Recommended Posts