{"id":26378,"date":"2023-03-09T16:28:58","date_gmt":"2023-03-09T15:28:58","guid":{"rendered":"https:\/\/www.altkomsoftware.com\/?p=26378"},"modified":"2025-04-01T10:53:11","modified_gmt":"2025-04-01T08:53:11","slug":"aws-machine-learning-w-klasyfikacji-transakcji-finansowych","status":"publish","type":"post","link":"https:\/\/stg.altkomsoftware.com\/pl\/blog\/aws-machine-learning-w-klasyfikacji-transakcji-finansowych\/","title":{"rendered":"Case Study: Automatyzacja klasyfikacji transakcji finansowych poprzez machine learning na chmurze AWS"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Projekt jednego z naszych klient\u00f3w z sektora finansowego obejmowa\u0142 wdro\u017cenie w pe\u0142ni konfigurowalnego narz\u0119dzia do zarz\u0105dzania procesami sprzeda\u017cowymi i oferowania produkt\u00f3w bankowych. Cz\u0119\u015bci\u0105 rozbudowanego systemu jest mo\u017cliwo\u015b\u0107 automatycznego przypisywania kategorii operacjom wp\u0142ywu na konta bankowe klient\u00f3w, dzi\u0119ki wykorzystaniu modelu machine learning umieszczonego w chmurze. W poni\u017cszym tek\u015bcie pokazujemy krok po kroku, jak stworzyli\u015bmy tego typu rozwi\u0105zanie i jakie us\u0142ugi AWS wykorzystali\u015bmy w tym celu.<\/strong>&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/altkomsoftware.com\/wp-content\/uploads\/2023\/03\/Wykorzystanie-Machine-Learning_1.jpg\" alt=\"Case study: Wykorzystanie Machine Learning do automatyzacji klasyfikacji transakcji finansowych\" class=\"wp-image-27203\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Modele <strong>machine learning<\/strong> s\u0105 coraz cz\u0119\u015bciej wykorzystywane do automatycznego przypisywania kategorii operacjom wp\u0142yw\u00f3w w sektorze bankowym. Wykorzystuj\u0105 algorytmy klasyfikacji, kt\u00f3re s\u0105 w stanie nauczy\u0107 si\u0119 z du\u017cych zbior\u00f3w danych, jakie kategorie przypisane s\u0105 do r\u00f3\u017cnych rodzaj\u00f3w transakcji. Po odpowiednim wytrenowaniu model mo\u017ce by\u0107 stosowany do automatycznego przypisywania kategorii do nowych transakcji.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W zale\u017cno\u015bci od dok\u0142adno\u015bci i precyzji klasyfikacji, modele uczenia maszynowego mog\u0105 by\u0107 wykorzystywane do usprawnienia procesu kategoryzacji operacji wp\u0142yw\u00f3w w sektorze bankowym, co pozwala na oszcz\u0119dno\u015b\u0107 czasu i zasob\u00f3w. Jednak\u017ce w przypadku, gdy model jest \u017ale nauczony lub bazuje na niedostatecznie reprezentatywnym zbiorze danych, mo\u017ce prowadzi\u0107 do b\u0142\u0119d\u00f3w w kategoryzacji.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W dalszej cz\u0119\u015bci tekstu m\u00f3wimy w zarysie dzia\u0142aj\u0105ce rozwi\u0105zanie, kt\u00f3re dostarczyli\u015bmy naszemu klientowi z sektora bankowego. Wspomnimy o problemach, z jakimi trzeba si\u0119 zmierzy\u0107, aby system m\u00f3g\u0142 realizowa\u0107 swoje zadania sprawnie, w mo\u017cliwie kr\u00f3tkim czasie i bez nara\u017cania klienta na dodatkowe koszty zwi\u0105zane z wykorzystywanymi us\u0142ugami AWS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jakie by\u0142y za\u0142o\u017cenia i cel tworzonego rozwi\u0105zania?&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">G\u0142\u00f3wnym celem, jaki zosta\u0142 postawiony przed wdro\u017conym systemem, by\u0142o w pe\u0142ni automatyczne przypisywanie kategorii operacjom wp\u0142ywu na konta bankowe klient\u00f3w z wykorzystaniem technologii bazuj\u0105cej na uczeniu maszynowym (<strong>machine learning<\/strong>).&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kategoria w\u0142a\u015bciwa dla danej operacji mia\u0142a by\u0107 \u201eodgadywana\u201d na podstawie p\u00f3l opisuj\u0105cych indywidualnie ka\u017cdy z przelew\u00f3w, takich jak: tytu\u0142, nazwa nadawcy czy kwota. Dopuszczona zosta\u0142a r\u00f3wnie\u017c mo\u017cliwo\u015b\u0107 posi\u0142kowania si\u0119 danymi z innych transakcji wp\u0142yw\u00f3w na to samo konto bankowe. To umo\u017cliwi\u0142o wykorzystanie podczas kategoryzacji r\u00f3\u017cnorakich wska\u017anik\u00f3w historycznych, odnosz\u0105cych si\u0119 zar\u00f3wno do przetwarzanej w danym momencie transakcji, jak i ca\u0142ego konta.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Za\u0142o\u017ceniem w pierwszym etapie projektu by\u0142 podzia\u0142 wp\u0142yw\u00f3w na 9 odr\u0119bnych kategorii, w\u015br\u00f3d kt\u00f3rych znalaz\u0142y si\u0119 m.in. wynagrodzenia, premie i r\u00f3\u017cnego rodzaju \u015bwiadczenia ZUS. Jednocze\u015bnie mia\u0142a zosta\u0107 zapewniona mo\u017cliwo\u015b\u0107 \u0142atwego rozszerzenia listy tych kategorii w przysz\u0142o\u015bci.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Model uczony maszynowo<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Przypisywanie kategorii powinno odbywa\u0107 si\u0119 w trybie wsadowym: na wej\u015bciu dostarczany jest zestaw danych o operacjach na pewnym zbiorze kont bankowych w okre\u015blonym przedziale czasu, a system ma za zadanie oznakowa\u0107 ka\u017cdy rekord odpowiedni\u0105 kategori\u0105, w kolejnym kroku zwracaj\u0105c uzupe\u0142niony w ten spos\u00f3b zbi\u00f3r danych. Ca\u0142y ten proces powinien by\u0107 mo\u017cliwy do uruchomienia przez obs\u0142ug\u0119 Banku i przebiega\u0107 w pe\u0142ni automatycznie.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poniewa\u017c \u2013 w my\u015bl za\u0142o\u017ce\u0144 \u2013 rdzeniem decyzyjnym systemu mia\u0142 by\u0107 uczony maszynowo model, dodatkowym aspektem projektu by\u0142o wypracowanie praktycznego procesu trenowania tego\u017c modelu. Trening mia\u0142 odbywa\u0107 si\u0119 w oparciu o dostarczone przez Bank dane w postaci historii operacji wp\u0142yw\u00f3w na konta klient\u00f3w z ju\u017c przypisanymi tym operacjom kategoriami. Zale\u017ca\u0142o nam, aby zaoferowa\u0107 klientowi mo\u017cliwo\u015b\u0107 \u0142atwego trenowania modelu we w\u0142asnym zakresie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dlaczego akurat chmura AWS?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Jednym z za\u0142o\u017ce\u0144 projektu by\u0142o r\u00f3wnie\u017c to, \u017ce rozwi\u0105zanie b\u0119dzie dzia\u0142a\u0107 w \u015brodowisku chmurowym. Wyb\u00f3r pad\u0142 na Amazon Web Services. Za AWS przemawia\u0142a m.in. dost\u0119pno\u015b\u0107 us\u0142ugi dedykowanej uczeniu maszynowemu (<a href=\"https:\/\/aws.amazon.com\/sagemaker\/\" target=\"_blank\" rel=\"noreferrer noopener\">Amazon SageMaker)<\/a>, jak r\u00f3wnie\u017c obecno\u015b\u0107 narz\u0119dzi ETL-owych, u\u017cytecznych przy wst\u0119pnym przetwarzaniu danych w du\u017cej ilo\u015bci.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ze wzgl\u0119du na usytuowanie rozwi\u0105zania poza infrastruktur\u0105 Banku, jedn\u0105 z kluczowych kwestii sta\u0142o si\u0119 bezpiecze\u0144stwo przetwarzanych danych. Nie trzeba wyja\u015bnia\u0107, jak bardzo wra\u017cliwe s\u0105 dane na temat aktywno\u015bci klient\u00f3w banku na ich kontach i jak wiele mo\u017cliwo\u015bci nadu\u017cy\u0107 mo\u017ce stworzy\u0107 ewentualny wyciek. Dlatego fundamentaln\u0105 kwesti\u0105 by\u0142o w\u0142a\u015bciwe zabezpieczenie danych, przede wszystkim na etapie obustronnego transferu pomi\u0119dzy \u015brodowiskiem chmurowym a systemami Banku oraz wewn\u0105trz samego AWS-a (in-rest oraz in-transit).&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kolejnymi wymogami, o kt\u00f3rych warto w tym miejscu wspomnie\u0107 by\u0142y: mo\u017cliwo\u015b\u0107 \u0142atwego deployowania ca\u0142o\u015bci rozwi\u0105zania na zadanym koncie AWS-owym, zapewnienie bezpiecze\u0144stwa jego obs\u0142ugi poprzez odpowiedni dob\u00f3r polityk i uprawnie\u0144, a tak\u017ce zadbanie o mo\u017cliwo\u015b\u0107 audytu systemu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zarys architektury rozwi\u0105zania<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W uj\u0119ciu funkcjonalnym system sk\u0142ada si\u0119 z dw\u00f3ch komponent\u00f3w: procesu przypisuj\u0105cego kategorie operacjom bankowym z wykorzystaniem modelu Machine Learning oraz procesu trenuj\u0105cego nowy model w oparciu o wcze\u015bniej skategoryzowane dane.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Z logicznego punktu widzenia poszczeg\u00f3lne procesy obejmuj\u0105 nast\u0119puj\u0105ce kroki.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. <strong>Proces kategoryzacji<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wst\u0119pne przefiltrowanie i normalizacja rekord\u00f3w operacji;&nbsp;<\/li>\n\n\n\n<li>Przekszta\u0142cenie danych rekord po rekordzie do postaci liczbowej, oczekiwanej przez model ML (preprocessing);&nbsp;<\/li>\n\n\n\n<li>Przeprowadzenie inferencji (kategoryzacji) przez model na przetworzonych danych;&nbsp;<\/li>\n\n\n\n<li>Przetworzenie wyniku pracy modelu;&nbsp;&nbsp;<\/li>\n\n\n\n<li>Przy\u0142\u0105czenie uzyskanych kategorii do oryginalnego zbioru danych, z zachowaniem odfiltrowanych na pocz\u0105tku rekord\u00f3w.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\"><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">2. Proces treningu modelu<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wst\u0119pne przefiltrowanie i normalizacja rekord\u00f3w operacji ze zbioru treningowego;&nbsp;<\/li>\n\n\n\n<li>Zbudowanie s\u0142ownika na bazie p\u00f3l tekstowych przy rekordach operacji;&nbsp;<\/li>\n\n\n\n<li>Przekszta\u0142cenie danych w taki sam spos\u00f3b jak w przypadku kategoryzacji, ale z uwzgl\u0119dnieniem ju\u017c przypisanych kategorii;&nbsp;<\/li>\n\n\n\n<li>Podzia\u0142 przetworzonych danych na podzbiory: trenuj\u0105cy, walidacyjny oraz testowy;&nbsp;<\/li>\n\n\n\n<li>Przeprowadzenie treningu modelu z u\u017cyciem przetworzonych danych;&nbsp;<\/li>\n\n\n\n<li>Zarejestrowanie modelu i umo\u017cliwienie korzystania z niego w ramach procesu kategoryzacji.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Co wa\u017cne, konieczne by\u0142o takie zaprojektowanie ka\u017cdego z tych proces\u00f3w, aby po pierwsze mo\u017cliwe by\u0142o w ich obr\u0119bie wywo\u0142ywanie r\u00f3\u017cnych<strong> us\u0142ug AWS<\/strong>, a po drugie, mog\u0142y one dzia\u0142a\u0107 d\u0142ugotrwale, nie generuj\u0105c koszt\u00f3w zwi\u0105zanych z sam\u0105 orkiestracj\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wykorzystanie mo\u017cliwo\u015bci AWS Step Functions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Odpowiedzi\u0105 na nasze wymagania okaza\u0142a si\u0119 <strong>us\u0142uga <\/strong><a href=\"https:\/\/aws.amazon.com\/step-functions\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>AWS<\/strong> Step Functions<\/a>. Centraln\u0105 koncepcj\u0105 dla tej us\u0142ugi jest maszyna stan\u00f3w, kt\u00f3r\u0105 mo\u017cna rozumie\u0107 jako graf. Ka\u017cdy jej w\u0119ze\u0142 opisuje jak\u0105\u015b akcj\u0119 realizowan\u0105 przez wywo\u0142ywan\u0105 w tym celu <strong>us\u0142ug\u0119 w AWS<\/strong>, a kraw\u0119dzie definiuj\u0105 nast\u0119pstwo tych akcji. Przy wywo\u0142ywaniu ka\u017cda akcja otrzymuje na wej\u015bciu niewielki obiekt zwany stanem, a na wyj\u015bciu generuje nowy obiekt stanu, kt\u00f3ry zostaje przekazany do akcji wykonywanej w nast\u0119pnej kolejno\u015bci. Taka filozofia dzia\u0142ania pozwala na realizacj\u0119 d\u0142ugotrwa\u0142ych proces\u00f3w przy minimalnym zaanga\u017cowaniu zasob\u00f3w potrzebnych do obs\u0142ugi samego procesu.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dodatkow\u0105 zalet\u0105 Step Functions okaza\u0142a si\u0119 przyjazno\u015b\u0107 obs\u0142ugi maszyn stan\u00f3w z poziomu konsoli AWS. W szczeg\u00f3lno\u015bci chodzi tu o monitoring dzia\u0142aj\u0105cego procesu (bardzo pomocna prezentacja maszyny w formie grafu), ale te\u017c o wgl\u0105d w histori\u0119 jego uruchomie\u0144.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Opisane czynniki spowodowa\u0142y, \u017ce <strong>us\u0142uga AWS<\/strong> Step Functions sta\u0142a si\u0119 naturalnym wyborem i oba wspomniane procesy \u2013 kategoryzacji i treningu \u2013 zosta\u0142y zaimplementowane jako maszyny stan\u00f3w. Dzi\u0119ki temu uruchomienie wybranego procesu sprowadza si\u0119 do odpalenia odpowiedniej maszyny oraz podaniu jej na wej\u015bciu zestawu parametr\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">AWS Step Functions a orkiestracja<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Minusem jest fakt, \u017ce jako narz\u0119dzie s\u0142u\u017c\u0105ce do orkiestracji, Step Functions potrafi dostarczy\u0107 jedynie szkielet, w kt\u00f3rym osadzane s\u0105 poszczeg\u00f3lne kroki sk\u0142adaj\u0105ce si\u0119 na ca\u0142o\u015b\u0107 procesu. Wykonanie jakiejkolwiek konkretnej czynno\u015bci \u2013 nawet najprostszej \u2013 nie jest mo\u017cliwe bez odwo\u0142ania si\u0119 do dedykowanej <strong>us\u0142ugi AWS.<\/strong> Dlatego us\u0142ugi wykorzystane w opisywanym rozwi\u0105zaniu opisujemy poni\u017cej.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sk\u0142adowanie danych: Amazon S3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pierwszym aspektem, o kt\u00f3ry nale\u017ca\u0142o si\u0119 zatroszczy\u0107, by\u0142 spos\u00f3b sk\u0142adowania danych. Ze wzgl\u0119du na du\u017cy wolumen, format wymiany (CSV) oraz konieczno\u015b\u0107 \u0142atwego dost\u0119pu z poziomu r\u00f3\u017cnych <strong>us\u0142ug AWS-owych<\/strong>, wyb\u00f3r pad\u0142 na <a href=\"https:\/\/aws.amazon.com\/s3\/\" target=\"_blank\" rel=\"noreferrer noopener\">Simple Storage Service<\/a>, czyli S3. Do korzy\u015bci p\u0142yn\u0105cych z u\u017cywania S3 \u2013 poza prostot\u0105 i uniwersalno\u015bci\u0105 \u2013 nale\u017cy doliczy\u0107 niskie koszty oraz \u0142atwo\u015b\u0107 zabezpieczenia danych za pomoc\u0105 kluczy szyfruj\u0105cych (us\u0142uga KMS).&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">G\u0142\u00f3wny bucket S3 jest miejscem, gdzie trafiaj\u0105 wszystkie dane przechodz\u0105ce przez system \u2013 wej\u015bciowe (dostarczane przez klienta), robocze oraz wyj\u015bciowe. Po\u0142o\u017cenie tych danych wewn\u0105trz bucketa mo\u017cna okre\u015bli\u0107, podaj\u0105c odpowiednie parametry przy wywo\u0142ywaniu danego procesu. W S3 zapisywane s\u0105 r\u00f3wnie\u017c skrypty i inne zasoby konieczne do wykonania poszczeg\u00f3lnych proces\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Przetwarzanie danych: AWS Glue<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Jak zosta\u0142o wcze\u015bniej wspomniane, danymi dostarczanymi na wej\u015bciu jest historia operacji bankowych w formacie CSV. Ka\u017cdy wiersz pliku opisuje pojedyncz\u0105 transakcj\u0119 wp\u0142ywu na konto bankowe, zawieraj\u0105c pola takie jak: unikalny identyfikator operacji, dane zleceniodawcy, dane beneficjenta, tytu\u0142 przelewu, kwota transakcji itd. Pojedynczy zestaw danych sk\u0142ada si\u0119 z wielu plik\u00f3w CSV i obejmuje kompletn\u0105 histori\u0119 operacji dla okre\u015blonego zbioru kont bankowych w danym okresie (np. 6 miesi\u0119cy). Brak przy tym za\u0142o\u017ce\u0144 dotycz\u0105cych sposobu rozmieszczenia rekord\u00f3w operacji w poszczeg\u00f3lnych plikach CSV czy te\u017c ich posortowania.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Og\u00f3lnie rzecz bior\u0105c, mamy zatem do czynienia z danym tabelarycznymi o dobrze okre\u015blonej strukturze i w du\u017cym wolumenie, zawartymi w plikach CSV. Do szybkiego i rozproszonego, a przy tym wygodnego przetwarzania danych tego rodzaju bardzo dobrze nadaje si\u0119 Apache Spark. Dost\u0119pny jest w \u015brodowisku AWS m.in. w ramach us\u0142ugi o nazwie <a href=\"https:\/\/aws.amazon.com\/glue\/\" target=\"_blank\" rel=\"noreferrer noopener\">AWS Glue<\/a>, kt\u00f3rej zdecydowali\u015bmy si\u0119 u\u017cy\u0107.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Czym jest AWS Glue?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">AWS Glue to do\u015b\u0107 rozbudowany zbi\u00f3r narz\u0119dzi wspomagaj\u0105cych procesy ETL-owe na danych o du\u017cym wolumenie, umo\u017cliwiaj\u0105cy podpinanie si\u0119 pod rozmaite \u017ar\u00f3d\u0142a danych. Na potrzeby omawianego systemu wybrane zosta\u0142y jedynie dwie funkcjonalno\u015bci Glue: zadania przetwarzania danych <em>(Glue jobs<\/em>) oraz katalog (<em>Glue Data Catalog<\/em>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zadania AWS Glue<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Zadania Glue s\u0105 de facto programami wykonywanymi w \u015brodowisku Spark (w naszym przypadku: PySpark), przy czym jest to \u015brodowisko automatycznie zarz\u0105dzane w celu zapewnienia maksymalnej skalowalno\u015bci. Wbudowane biblioteki dostarczaj\u0105 narz\u0119dzia wspomagaj\u0105ce ten cel. Dodatkowo Glue umo\u017cliwia \u0142atwy, dwukierunkowy dost\u0119p do danych w \u017ar\u00f3d\u0142ach specyficznych dla AWS-a, co w omawianym przypadku mia\u0142o znaczenie ze wzgl\u0119du na sk\u0142adowanie wszystkich danych w S3.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W formie zada\u0144 Glue zosta\u0142y zaimplementowane wszystkie kroki zwi\u0105zane z przetwarzaniem danych, wchodz\u0105ce w sk\u0142ad proces\u00f3w kategoryzacji i treningu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Odfiltrowanie danych, ich normalizacja i skatalogowanie;&nbsp;<\/li>\n\n\n\n<li>Zbudowanie plik\u00f3w s\u0142ownik\u00f3w;&nbsp;<\/li>\n\n\n\n<li>Transformacja danych do postaci oczekiwanej przez model;&nbsp;<\/li>\n\n\n\n<li>Przetworzenie wyniku kategoryzacji;&nbsp;<\/li>\n\n\n\n<li>Przygotowanie ko\u0144cowego zbioru danych (z kategoriami);&nbsp;<\/li>\n\n\n\n<li>Podzia\u0142 danych treningowych na podzbiory.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\"><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cde z tych zada\u0144 odczytuje dane wej\u015bciowe z S3, dokonuje ich przetworzenia (lub agregacji), by w ko\u0144cu zapisa\u0107 uzyskany wynik w odr\u0119bnym folderze S3. W przypadku kroku kataloguj\u0105cego, dany wynik trafia do S3 za po\u015brednictwem Glue Data Catalog.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pewnym wyzwaniem by\u0142o przygotowanie zada\u0144 w taki spos\u00f3b, aby mo\u017cna by\u0142o je \u0142atwo wywo\u0142ywa\u0107 lokalnie, wewn\u0105trz deweloperskiego obrazu Glue dostarczanego przez Amazon. Mo\u017cliwo\u015b\u0107 odpalania zada\u0144 lokalnie otworzy\u0142a drog\u0119 do prostego (i bezkosztowego) testowania ich kodu, a tak\u017ce lokalnego preprocessingu danych podczas prac nad architektur\u0105 modelu.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Model ML: Amazon SageMaker&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Centralnym elementem rozwi\u0105zania jest model <strong>machine learning, <\/strong>odpowiedzialny za przypisywanie kategorii operacjom wp\u0142yw\u00f3w. Mo\u017cna powiedzie\u0107, \u017ce pozosta\u0142e cz\u0119\u015bci systemu s\u0105 dla niego jedynie opakowaniem, zapewniaj\u0105cym \u201ekomunikacj\u0119 ze \u015bwiatem\u201d. Kroki anga\u017cuj\u0105ce model s\u0105 kluczowe dla obu proces\u00f3w dostarczanych przez system.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tworzenie modelu i jego wykorzystanie \u2013 a wi\u0119c to, co sk\u0142ada si\u0119 na <strong>machine learningowy<\/strong> aspekt rozwi\u0105zania \u2013 zosta\u0142y zrealizowane przy wsparciu AWS-owej us\u0142ugi <a href=\"https:\/\/aws.amazon.com\/sagemaker\/\" target=\"_blank\" rel=\"noreferrer noopener\">SageMaker.<\/a>&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W naszym rozumieniu model to zarejestrowana w SageMakerze instancja modelu inferencyjnego, na kt\u00f3r\u0105 sk\u0142adaj\u0105 si\u0119 przede wszystkim adres obrazu Dockera ze \u015brodowiskiem uruchomieniowym (jeden z gotowych obraz\u00f3w udost\u0119pnianych przez AWS) oraz odno\u015bnik do zlokalizowanego w S3 pliku z zapisanym i wytrenowanym modelem. Plik ten zawiera zar\u00f3wno parametry wyuczone podczas treningu, jak i wykonywalny kod, kt\u00f3ry SageMaker \u2013 na potrzeby inferencji \u2013&nbsp; uruchamia wewn\u0105trz zadanego obrazu dockerowego.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kategoryzacja modelu<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Przeprowadzenie kategoryzacji sprowadza si\u0119 do uruchomienia w SageMakerze zadania przetwarzania wsadowego <em>(Batch Transform Job<\/em>) z nazw\u0105 modelu jako parametrem. W\u015br\u00f3d parametr\u00f3w znajduj\u0105 si\u0119 te\u017c \u015bcie\u017cka do katalogu z danymi operacji w S3 oraz \u015bcie\u017cka, pod kt\u00f3r\u0105 ma by\u0107 zapisany wynik. Zadanie to jest uruchamiane z poziomu maszyny Step Functions, odpowiedzialnej za przypisywanie kategorii.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Trening modelu<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Trening modelu r\u00f3wnie\u017c polega na uruchomieniu w SageMakerze odpowiedniego zadania. Odpowiedzialna jest za to druga z maszyn Step Functions i jest to tym razem zadanie treningowe (<em>Training Job<\/em>). Lista parametr\u00f3w jest tutaj nieco d\u0142u\u017csza ni\u017c w przypadku inferencji, obejmuj\u0105c m.in. hiperparametry modelu, \u015bcie\u017cki do poszczeg\u00f3lnych podzbior\u00f3w zbioru danych treningowych (trening, walidacja, test), odno\u015bnik do skryptu trenuj\u0105cego oraz adres obrazu Dockera uruchamiaj\u0105cego skrypt.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trening ko\u0144czy si\u0119 zapisem danych wynikowych w odpowiednim miejscu w S3 i zarejestrowaniem nowej instancji modelu w SageMakerze. W\u015br\u00f3d plik\u00f3w zapisywanych w S3 znajduj\u0105 si\u0119 nie tylko dane modelu, ale r\u00f3wnie\u017c pliki daj\u0105ce wgl\u0105d w przebieg treningu i skuteczno\u015b\u0107 modelu, uzyskan\u0105 na poszczeg\u00f3lnych podzbiorach.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Skrypt trenuj\u0105cy<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u201eSercem\u201d zadania treningowego w SageMakerze jest skrypt trenuj\u0105cy. Odpowiada on za zbudowanie modelu, jego iteracyjny trening i zapis wygenerowanego kodu modelu wraz z wyuczonymi parametrami. Opcjonalnie mo\u017ce by\u0107 r\u00f3wnie\u017c przeprowadzony test modelu na podzbiorze danych wydzielonych ze zbioru treningowego. Wyniki testu s\u0105 zapisywane i trafiaj\u0105 ostatecznie do S3, aby mo\u017cna si\u0119 by\u0142o z nimi zapozna\u0107. Podczas treningu i testowania do log\u00f3w CloudWatch zapisywane s\u0105 r\u00f3wnie\u017c metryki, daj\u0105ce wgl\u0105d \u201ena \u017cywo\u201d w zmieniaj\u0105c\u0105 si\u0119 skuteczno\u015b\u0107 modelu. Najistotniejsze s\u0105 tu dwie wielko\u015bci: dok\u0142adno\u015b\u0107 (<em>accuracy<\/em>), czyli skuteczno\u015b\u0107 \u201eprocentowa\u201d, oraz warto\u015b\u0107 funkcji straty (<em>loss)<\/em>, czyli u\u015bredniona miara wielko\u015bci b\u0142\u0119d\u00f3w czynionych przez model (im bli\u017cej 0, tym lepiej). Dla ka\u017cdego z trzech podzbior\u00f3w publikowana jest para takich metryk.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aby tak wytrenowany model u\u017cyty zosta\u0142 przy kategoryzowaniu operacji, wystarczy wskaza\u0107 go za pomoc\u0105 odpowiedniego parametru podczas wywo\u0142ywania procesu kategoryzacji.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W projekcie dostarczona zosta\u0142a tak\u017ce mo\u017cliwo\u015b\u0107 dotrenowania istniej\u0105cego modelu now\u0105 porcj\u0105 danych. W takim przypadku skrypt trenuj\u0105cy wczytuje uprzednio zapisany model, po czym przeprowadza trening w standardowy spos\u00f3b. Pliki dotrenowanego modelu zapisywane s\u0105 oddzielnie w S3, a w SageMakerze rejestrowana jest nowa instancja modelu inferencyjnego.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"761\" height=\"680\" src=\"https:\/\/altkomsoftware.com\/wp-content\/uploads\/2023\/03\/Infographic-eng.png\" alt=\"Infographic showing Machine Learning model: Amazon SageMaker\" class=\"wp-image-26384\" srcset=\"https:\/\/stg.altkomsoftware.com\/wp-content\/uploads\/2023\/03\/Infographic-eng.png 761w, https:\/\/stg.altkomsoftware.com\/wp-content\/uploads\/2023\/03\/Infographic-eng-300x268.png 300w\" sizes=\"(max-width: 761px) 100vw, 761px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Wspomaganie proces\u00f3w: AWS Lambda&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Step Functions, jako narz\u0119dzie s\u0142u\u017c\u0105ce jedynie orkiestracji, nie oferuje same z siebie mo\u017cliwo\u015bci implementacji rozbudowanej logiki, wychodz\u0105cej poza warunkowe wykonywanie wybranych ga\u0142\u0119zi grafu i proste transformacje stanu. Nie jest mo\u017cliwe cho\u0107by dodawanie do stanu nowych p\u00f3l, nie m\u00f3wi\u0105c ju\u017c np. o operowaniu na plikach w S3. Realizacja tego rodzaju dzia\u0142a\u0144 wymaga wi\u0119c wpi\u0119cia w maszyn\u0119 stan\u00f3w takiej us\u0142ugi AWS, kt\u00f3ra daje mo\u017cliwo\u015b\u0107 wykonania dowolnego kodu. Dobrze do tego celu nadaje si\u0119 <a href=\"https:\/\/aws.amazon.com\/lambda\/\" target=\"_blank\" rel=\"noreferrer noopener\">AWS Lambda<\/a>, czyli us\u0142uga umo\u017cliwiaj\u0105ca wykonywanie predefiniowanych, kr\u00f3tko dzia\u0142aj\u0105cych funkcji w \u015brodowisku bezserwerowym (serverless).&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcje Lambda zosta\u0142y wykorzystane do nast\u0119puj\u0105cych czynno\u015bci, realizowanych w nieco r\u00f3\u017cny spos\u00f3b w obr\u0119bie ka\u017cdego z dw\u00f3ch proces\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Walidacja parametr\u00f3w wej\u015bciowych i przygotowanie pocz\u0105tkowego stanu maszyny Step Functions;&nbsp;<\/li>\n\n\n\n<li>Przygotowanie plik\u00f3w roboczych w S3;&nbsp;<\/li>\n\n\n\n<li>Czyszczenie danych roboczych \u2013 w S3 i Glue Data Catalogu \u2013 po udanym zako\u0144czeniu procesu.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\"><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dodatkowo, w przypadku procesu treningowego, funkcja Lambda u\u017cywana jest do zebrania plik\u00f3w powsta\u0142ych podczas treningu do wsp\u00f3lnego katalogu wynikowego.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Monitoring rozwi\u0105zania: AWS Config i AWS CloudTrail<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Do kontroli bezpiecze\u0144stwa rozwi\u0105zania u\u017cyto dw\u00f3ch us\u0142ug:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. AWS Config<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Us\u0142uga pozwalaj\u0105ca na przeskanowanie konfiguracji u\u017cytych us\u0142ug zgodnie z wybranymi regu\u0142ami bezpiecze\u0144stwa w Config. Raport z us\u0142ugi pozwala na szybk\u0105 analiz\u0119 w zakresie tego, czy wyst\u0119puj\u0105 jakie\u015b problemy oraz czy us\u0142ugi s\u0105 poprawnie skonfigurowane.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142adowo: jedna z regu\u0142 <a href=\"https:\/\/aws.amazon.com\/config\/\" target=\"_blank\" rel=\"noreferrer noopener\">AWS Config<\/a> pozwala na sprawdzenie, czy wszystkie buckety S3 maj\u0105 w\u0142\u0105czone domy\u015blne szyfrowanie danych oraz czy wymuszaj\u0105 bezpieczn\u0105 wymian\u0119 danych pomi\u0119dzy S3 a innymi us\u0142ugami. Warto wykonywa\u0107 okresowe kontrole poprawno\u015bci konfiguracji us\u0142ug, gdy\u017c w czasie \u017cycia aplikacji konfiguracja us\u0142ug AWS mo\u017ce si\u0119 zmienia\u0107 (np. podczas deploymentu kolejnych wersji aplikacji).&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. AWS CloudTrail<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Jest to druga us\u0142uga do kontroli bezpiecze\u0144stwa w opisywanym rozwi\u0105zaniu. <a href=\"https:\/\/aws.amazon.com\/cloudtrail\/\" target=\"_blank\" rel=\"noreferrer noopener\">AWS CloudTrail<\/a> zbiera informacje o wszelkich zmianach w konfiguracji us\u0142ug, wywo\u0142ywania API us\u0142ug oraz udanych i nieudanych pr\u00f3b uwierzytelniania i autoryzacji.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podczas konfiguracji nale\u017cy wybra\u0107 zestaw zdarze\u0144, kt\u00f3re chcemy monitorowa\u0107, poniewa\u017c w trakcie dzia\u0142ania naszego rozwi\u0105zania us\u0142uga ta zbiera informacje w\u0142a\u015bnie o zdarzeniach. Dzi\u0119ki nim mo\u017cemy dowiedzie\u0107 si\u0119, kto zmieni\u0142 konfiguracje us\u0142ugi, je\u017celi ta przesta\u0142a dzia\u0142a\u0107 albo nie dzia\u0142a tak, jak zak\u0142adali\u015bmy. Mo\u017cemy tak\u017ce dowiedzie\u0107 si\u0119, kto pr\u00f3bowa\u0142 logowa\u0107 si\u0119 do naszych us\u0142ug albo kto pobiera\u0142 dane z S3.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Powy\u017csze dwie proste us\u0142ugi zapewniaj\u0105, \u017ce dzia\u0142aj\u0105ca aplikacja jest bezpieczna, a zdarzenia wewn\u0105trz niej s\u0105 monitorowane.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preprocessing danych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Co do zasady, modele <strong>machine learning <\/strong>potrafi\u0105 operowa\u0107 jedynie na danych liczbowych. Dlatego, aby przeprowadzenie kategoryzacji by\u0142o w og\u00f3le mo\u017cliwe, konieczne jest przetransformowanie ka\u017cdego rekordu operacji na ci\u0105g liczb (wektor), w kt\u00f3rym zakodowane b\u0119dzie mo\u017cliwie du\u017co informacji potencjalnie istotnych dla wyboru w\u0142a\u015bciwej kategorii. O ile w przypadku p\u00f3l takich jak kwota czy data transakcji zamiana ich warto\u015bci na liczby nie jest problemem, to kiedy mamy do czynienia z polami tekstowymi \u2013 takimi jak tytu\u0142 przelewu czy nazwa jego nadawcy \u2013 sprawa staje si\u0119 bardziej z\u0142o\u017cona. Jak bowiem zaszy\u0107 w wektorze liczbowym informacj\u0119 o wyst\u0105pieniu w tek\u015bcie pewnego s\u0142owa o kluczowym znaczeniu, maj\u0105c na uwadze, \u017ce s\u0142owo to mo\u017ce pojawia\u0107 si\u0119 w r\u00f3\u017cnych formach fleksyjnych oraz r\u00f3\u017cnym kontek\u015bcie?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Natural Language Processing w machine learning<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Jest to podstawowy problem, z kt\u00f3rym trzeba si\u0119 zmierzy\u0107 podczas implementacji rozwi\u0105zania <strong>machine learning<\/strong> w dziedzinie przetwarzania j\u0119zyka naturalnego (<em>Natural Language Processing,<\/em> czyli NLP). Z pomoc\u0105 przychodz\u0105 tutaj r\u00f3\u017cne techniki wektoryzacji tekstu. W omawianym przypadku skuteczne okaza\u0142o si\u0119 relatywnie proste rozwi\u0105zanie, oparte na detekcji najcz\u0119\u015bciej wyst\u0119puj\u0105cych s\u0142\u00f3w (z uwzgl\u0119dnieniem kategorii) i oznaczaniu faktu ich wyst\u0105pienia poprzez wpisanie warto\u015bci niezerowej na ustalonych pozycjach w wektorze. Na etapie budowania s\u0142ownik\u00f3w, napotkane wyrazy s\u0105 oczywi\u015bcie przetwarzane, m.in. w celu zneutralizowania r\u00f3\u017cnych form tego samego s\u0142owa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zwektoryzowane warto\u015bci p\u00f3l tekstowych to najistotniejsza, ale nie jedyna cz\u0119\u015b\u0107 wektora operacji. Zosta\u0142 do niego w\u0142\u0105czony r\u00f3wnie\u017c szereg dodatkowych p\u00f3l, charakteryzuj\u0105cych w formie liczbowej zar\u00f3wno sam\u0105 transakcj\u0119 przelewu, jak i konto beneficjenta. W przypadku tego ostatniego wzi\u0119to pod uwag\u0119 szeroko rozumian\u0105 charakterystyk\u0119 wp\u0142yw\u00f3w na dane konto. Na uwag\u0119 zas\u0142uguj\u0105 odnosz\u0105ce si\u0119 do analizowanej operacji wska\u017aniki historyczne, kt\u00f3re potrafi\u0105 da\u0107 informacj\u0119 m.in. o tym, w jakim stopniu przelew jest powtarzalny (np. wynagrodzenie w tej samej kwocie, wp\u0142ywaj\u0105ce co miesi\u0105c).&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przetworzenie danych na potrzeby modelu okaza\u0142o si\u0119 najbardziej zasoboch\u0142onnym krokiem w obu procesach. Czas potrzebny na jego uko\u0144czenie uda\u0142o si\u0119 skr\u00f3ci\u0107 stosuj\u0105c zr\u00f3wnoleglenie na poziomie zada\u0144 Glue. Konieczne by\u0142y te\u017c liczne optymalizacje w kodzie. Niebagatelne znaczenie mia\u0142a tutaj specyfika generowanych danych: rekordy z bardzo du\u017c\u0105 liczb\u0105 p\u00f3l (kilka tysi\u0119cy).&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Architektura i implementacja modelu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Do implementacji modelu pos\u0142u\u017cy\u0142a nam biblioteka TensorFlow z API Keras. Wyb\u00f3r ten motywowany by\u0142 zar\u00f3wno wcze\u015bniejsz\u0105 znajomo\u015bci\u0105 tego narz\u0119dzia i wygod\u0105 jego obs\u0142ugi, jak i r\u00f3wnie\u017c faktem, \u017ce SageMaker oferuje szereg dedykowanych pod uczenie maszynowe gotowych obraz\u00f3w Dockera, wykorzystuj\u0105cych t\u0119 w\u0142a\u015bnie bibliotek\u0119 (w wariantach pod CPU i GPU).&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sam model oparty zosta\u0142 o architektur\u0119 wielowarstwowej sieci neuronowej typu feed-forward. Na wej\u015bcie trafiaj\u0105 rekordy operacji prze\u0142o\u017cone do postaci wektor\u00f3w liczbowych, na wyj\u015bciu model zwraca wektor o rozmiarze odpowiadaj\u0105cym liczbie kategorii, kt\u00f3rego poszczeg\u00f3lne warto\u015bci mo\u017cna rozumie\u0107 jako wsp\u00f3\u0142czynniki przynale\u017cno\u015bci do kolejnych kategorii.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poniewa\u017c na wej\u015bcie trafiaj\u0105 wektory tzw. rozrzedzone (ang. <em>sparse<\/em>), z du\u017c\u0105 ilo\u015bci\u0105 warto\u015bci zerowych, rol\u0105 pierwszych warstw modelu jest kompresja wektora wej\u015bciowego do akceptowalnego rozmiaru (kilkaset warto\u015bci). Uk\u0142ad dalszych warstw zosta\u0142 zaprojektowany w ten spos\u00f3b, aby model by\u0142 w stanie optymalnie wy\u0142apa\u0107 zale\u017cno\u015bci mog\u0105ce przek\u0142ada\u0107 si\u0119 na przynale\u017cno\u015b\u0107 danej operacji do konkretnej kategorii.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przetestowanych zosta\u0142o kilkana\u015bcie r\u00f3\u017cnych wariant\u00f3w architektury modelu, co pozwoli\u0142o wy\u0142oni\u0107 architektur\u0119 charakteryzuj\u0105c\u0105 si\u0119 wysok\u0105 skuteczno\u015bci\u0105, a przy tym wzgl\u0119dnie prost\u0105 (mniejsze ryzyko \u201eprzeuczenia\u201d modelu, objawiaj\u0105cego si\u0119 spadkiem jego skuteczno\u015bci na realnych zbiorach danych). Model w wybranej architekturze zosta\u0142 zaimplementowany wewn\u0105trz opisanego wcze\u015bniej skryptu treningowego.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jako\u015b\u0107 uzyskanego modelu machine learning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Produkcyjny model \u2013 a dok\u0142adniej jego pierwsza iteracja \u2013 wytrenowany zosta\u0142 na zbiorze danych obejmuj\u0105cym operacje na 100 tys. kont bankowych z okresu 15 miesi\u0119cy, pomniejszonym o \u201ekomisyjnie\u201d wydzielony zbi\u00f3r testowy stanowi\u0105cy ok. 10% transakcji z ko\u0144cowych 12 miesi\u0119cy ca\u0142kowitego okresu.&nbsp; \u0141\u0105czna liczba rekord\u00f3w u\u017cytych do treningu wynosi\u0142a w przybli\u017ceniu 6,5 miliona.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uzyskano skuteczno\u015b\u0107 w granicach od 98.9% do 99.2% na zbiorze testowym, przy czym warto tutaj wspomnie\u0107, \u017ce du\u017ca cz\u0119\u015b\u0107 b\u0142\u0119d\u00f3w modelu wi\u0105za\u0142a si\u0119 z faktem \u201edetekcji\u201d przez ten model nieprawid\u0142owo\u015bci w kategoriach przypisanych operacjom w zbiorze treningowym dostarczonym przez klienta.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/stg.altkomsoftware.com\/pl\/kontakt\/\"><img decoding=\"async\" src=\"https:\/\/altkomsoftware.com\/wp-content\/uploads\/2023\/03\/Design_3.jpg\" alt=\"Wykorzystaj rozwi\u0105zanie chmurowe, \u017ceby zwi\u0119kszy\u0107 wydajno\u015b\u0107 swojej firmy. Napisz do nas\" class=\"wp-image-27208\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Deployment rozwi\u0105zania<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Do szybkiego, zautomatyzowanego instalowania i aktualizacji rozwi\u0105zania <strong>machine learning<\/strong> na kilku r\u00f3\u017cnych kontach AWS pos\u0142u\u017cy\u0142o stworzone przez HashiCorp narz\u0119dzie TerraForm, b\u0119d\u0105ce alternatyw\u0105 dla oferowanej przez Amazon us\u0142ugi CloudFormation. Infrastruktura rozwi\u0105zania zosta\u0142a rozpisana w postaci plik\u00f3w konfiguracyjnych, zawieraj\u0105cych deklaracje wszystkich niezb\u0119dnych komponent\u00f3w AWS w specyficznym dla TerraForma j\u0119zyku. Skonfigurowane zosta\u0142y r\u00f3wnie\u017c pliki, kt\u00f3re powinny znale\u017a\u0107 si\u0119 w S3, aby rozwi\u0105zanie mog\u0142o zadzia\u0142a\u0107 (takie jak np. skrypty zada\u0144 Glue). Warto\u015bci takie jak identyfikator docelowego konta czy region odczytywane s\u0105 ze zmiennych, co umo\u017cliwia \u0142atwy deployment na dowolnym koncie AWS, o ile tylko posiadane uprawnienia na to pozwalaj\u0105.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sam deployment sprowadza si\u0119 do wywo\u0142ania prostego polecenia, dostarczanego przez TerraForm, kt\u00f3re synchronizuje stan zadanego konta AWS z zawarto\u015bci\u0105 plik\u00f3w konfiguracyjnych oraz przechowywanych lokalnie zasob\u00f3w (spakowanych funkcji Lambda, plik\u00f3w wgrywanych do S3 i innych).&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Przeczytaj wi\u0119cej<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/stg.altkomsoftware.com\/pl\/blog\/case-study-data-lake-w-chmurze-aws\/\" target=\"_blank\" rel=\"noreferrer noopener\">Data Lake w chmurze AWS, czyli pewny spos\u00f3b na efektywn\u0105 analiz\u0119 danych firmowych<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/stg.altkomsoftware.com\/pl\/blog\/azure-cloud-w-projektach-iot-i-ai\/\" target=\"_blank\" rel=\"noreferrer noopener\">Wykorzystanie mo\u017cliwo\u015bci chmury obliczeniowej w projektach IoT i AI<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/stg.altkomsoftware.com\/pl\/blog\/jak-nowoczesny-marketplace-moze-skorzystac-na-rozwiazaniach-aws-cloud\/\" target=\"_blank\" rel=\"noreferrer noopener\">Jak nowoczesny marketplace mo\u017ce skorzysta\u0107 na rozwi\u0105zaniach AWS Cloud?<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Projekt jednego z naszych klient\u00f3w z sektora finansowego obejmowa\u0142 wdro\u017cenie w pe\u0142ni konfigurowalnego narz\u0119dzia do zarz\u0105dzania procesami sprzeda\u017cowymi i oferowania produkt\u00f3w bankowych. Cz\u0119\u015bci\u0105 rozbudowanego systemu jest mo\u017cliwo\u015b\u0107 automatycznego przypisywania kategorii operacjom wp\u0142ywu na konta bankowe klient\u00f3w, dzi\u0119ki wykorzystaniu modelu machine learning umieszczonego w chmurze. W poni\u017cszym tek\u015bcie pokazujemy krok po kroku, jak stworzyli\u015bmy tego typu [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":26239,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"topic":[],"blog-author":[],"class_list":["post-26378","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bez-kategorii"],"acf":[],"_links":{"self":[{"href":"https:\/\/stg.altkomsoftware.com\/pl\/wp-json\/wp\/v2\/posts\/26378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/stg.altkomsoftware.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/stg.altkomsoftware.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/stg.altkomsoftware.com\/pl\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/stg.altkomsoftware.com\/pl\/wp-json\/wp\/v2\/comments?post=26378"}],"version-history":[{"count":3,"href":"https:\/\/stg.altkomsoftware.com\/pl\/wp-json\/wp\/v2\/posts\/26378\/revisions"}],"predecessor-version":[{"id":40097,"href":"https:\/\/stg.altkomsoftware.com\/pl\/wp-json\/wp\/v2\/posts\/26378\/revisions\/40097"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/stg.altkomsoftware.com\/pl\/wp-json\/wp\/v2\/media\/26239"}],"wp:attachment":[{"href":"https:\/\/stg.altkomsoftware.com\/pl\/wp-json\/wp\/v2\/media?parent=26378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/stg.altkomsoftware.com\/pl\/wp-json\/wp\/v2\/categories?post=26378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/stg.altkomsoftware.com\/pl\/wp-json\/wp\/v2\/tags?post=26378"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/stg.altkomsoftware.com\/pl\/wp-json\/wp\/v2\/topic?post=26378"},{"taxonomy":"blog-author","embeddable":true,"href":"https:\/\/stg.altkomsoftware.com\/pl\/wp-json\/wp\/v2\/blog-author?post=26378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}