Generativ dataintelligens

Akselerer ML-arbeidsflyter med Amazon SageMaker Studio Local Mode og Docker-støtte | Amazon Web Services

Dato:

Vi er glade for å kunngjøre to nye funksjoner i Amazon SageMaker Studio som vil akselerere iterativ utvikling for maskinlæringsutøvere (ML): Local Mode og Docker-støtte. ML-modellutvikling involverer ofte langsomme iterasjonssykluser når utviklere bytter mellom koding, opplæring og distribusjon. Hvert trinn krever å vente på at eksterne databehandlingsressurser starter opp, noe som forsinker validering av implementeringer og tilbakemelding på endringer.

Med lokal modus kan utviklere nå trene og teste modeller, feilsøke kode og validere ende-til-ende-rørledninger direkte på SageMaker Studio-notebook-forekomsten uten behov for å spinne opp eksterne dataressurser. Dette reduserer iterasjonssyklusen fra minutter ned til sekunder, og øker utviklerproduktiviteten. Docker-støtte i SageMaker Studio-notebooks gjør det mulig for utviklere å enkelt bygge Docker-containere og få tilgang til forhåndsbygde containere, noe som gir et konsistent utviklingsmiljø på tvers av teamet og unngår tidkrevende oppsett og avhengighetsadministrasjon.

Lokal modus og Docker-støtte tilbyr en strømlinjeformet arbeidsflyt for validering av kodeendringer og prototyping av modeller ved å bruke lokale beholdere som kjører på en SageMaker Studio-notisbok

forekomst. I dette innlegget veileder vi deg gjennom å sette opp lokal modus i SageMaker Studio, kjøre en prøveopplæringsjobb og distribuere modellen på en Amazon SageMaker endepunkt fra en SageMaker Studio-notisbok.

SageMaker Studio lokal modus

SageMaker Studio introduserer lokal modus, som lar deg kjøre SageMaker-trenings-, inferens-, batchtransformerings- og prosesseringsjobber direkte på JupyterLab, Code Editor eller SageMaker Studio Classic bærbare instanser uten å kreve eksterne dataressurser. Fordeler med å bruke lokal modus inkluderer:

  • Øyeblikkelig validering og testing av arbeidsflyter rett innenfor integrerte utviklingsmiljøer (IDE)
  • Raskere iterasjon gjennom lokale kjøringer for mindre skalajobber for å inspisere utdata og identifisere problemer tidlig
  • Forbedret utvikling og feilsøkingseffektivitet ved å eliminere ventetiden på fjernopplæringsjobber
  • Umiddelbar tilbakemelding på kodeendringer før du kjører hele jobber i skyen

Følgende figur illustrerer arbeidsflyten ved å bruke lokal modus på SageMaker.

Arbeidsflyt ved bruk av lokal modus på SageMaker

For å bruke lokal modus, still inn instance_type='local' når du kjører SageMaker Python SDK-jobber som trening og inferens. Dette vil kjøre dem på forekomstene som brukes av SageMaker Studio IDE-ene i stedet for å klargjøre skyressurser.

Selv om visse funksjoner som distribuert opplæring bare er tilgjengelig i skyen, fjerner lokal modus behovet for å bytte kontekst for raske iterasjoner. Når du er klar til å dra nytte av den fulle kraften og skalaen til SageMaker, kan du sømløst kjøre arbeidsflyten din i skyen.

Docker-støtte i SageMaker Studio

SageMaker Studio gjør det nå også mulig å bygge og kjøre Docker-beholdere lokalt på SageMaker Studio-notebook-forekomsten. Denne nye funksjonen lar deg bygge og validere Docker-bilder i SageMaker Studio før du bruker dem til SageMaker-trening og slutninger.

Følgende diagram illustrerer Docker-orkestreringsarkitekturen på høyt nivå i SageMaker Studio.

Docker-orkestreringsarkitektur på høyt nivå i SageMaker Studio

Med Docker-støtte i SageMaker Studio kan du:

  • Bygg Docker-containere med integrerte modeller og avhengigheter direkte i SageMaker Studio
  • Eliminer behovet for eksterne Docker byggeprosesser for å forenkle bildeoppretting
  • Kjør containere lokalt for å validere funksjonalitet før du distribuerer modeller til produksjon
  • Gjenbruk lokale containere når du distribuerer til SageMaker for opplæring og hosting

Selv om noen avanserte Docker-funksjoner som multi-container og tilpassede nettverk ikke støttes når dette skrives, er kjernebyggings- og kjørefunksjonaliteten tilgjengelig for å akselerere utvikling av containere for arbeidsflyter med din egen container (BYOC).

Forutsetninger

For å bruke lokal modus i SageMaker Studio-applikasjoner, må du fullføre følgende forutsetninger:

  • For å hente bilder fra Amazon Elastic Container Registry (Amazon ECR), kontoen som er vert for ECR-bildet må gi tilgangstillatelse til brukerens Identitets- og tilgangsstyring (IAM) rolle. Domenets rolle må også tillate Amazon ECR-tilgang.
  • For å aktivere lokal modus og docker-funksjoner, må du angi EnableDockerAccess parameteren til sann for domenets DockerSettings bruker AWS kommandolinjegrensesnitt (AWS CLI). Dette lar brukere i domenet bruke lokal modus og Docker-funksjoner. Som standard er Local Mode og Docker deaktivert i SageMaker Studio. Eventuelle eksisterende SageMaker Studio-apper må startes på nytt for at Docker-tjenesteoppdateringen skal tre i kraft. Følgende er et eksempel på AWS CLI-kommando for å oppdatere et SageMaker Studio-domene:
aws sagemaker --region <REGION> 
update-domain --domain-id <DOMAIN-ID> 
--domain-settings-for-update '{"DockerSettings": {"EnableDockerAccess": "ENABLED"}}'

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:CompleteLayerUpload",
        "ecr:UploadLayerPart",
        "ecr:InitiateLayerUpload",
        "ecr:BatchCheckLayerAvailability",
        "ecr:PutImage"
      ],
      "Resource": "arn:aws:ecr:us-east-2:123456789012:repository/<repositoryname>"
    },
    {
      "Effect": "Allow",
      "Action": "ecr:GetAuthorizationToken",
      "Resource": "*"
    }
  ]
}

Kjør Python-filer i SageMaker Studio-rom med lokal modus

SageMaker Studio JupyterLab og Code Editor (basert på Code-OSS, Visual Studio Code – åpen kildekode), utvider SageMaker Studio slik at du kan skrive, teste, feilsøke og kjøre analyse- og ML-koden ved hjelp av den populære lette IDE. For mer informasjon om hvordan du kommer i gang med SageMaker Studio IDE-er, se Øk produktiviteten på Amazon SageMaker Studio: Vi introduserer JupyterLab Spaces og generative AI-verktøy og Ny – Code Editor, basert på Code-OSS VS Code Open Source nå tilgjengelig i Amazon SageMaker Studio. Fullfør følgende trinn:

Kjør Python-filer i SageMaker Studio-rom med lokal modus Kjør Python-filer i SageMaker Studio-rom med lokal modus

  • Opprett en ny terminal.  Kjør Python-filer i SageMaker Studio-rom med lokal modus Kjør Python-filer i SageMaker Studio-rom med lokal modus
  • Installer Plugin-modulen Docker CLI og Docker Compose ved å følge instruksjonene nedenfor GitHub repo. Hvis kjedede kommandoer mislykkes, kjør kommandoene én om gangen.

Kjør Python-filer i SageMaker Studio-rom med lokal modus Kjør Python-filer i SageMaker Studio-rom med lokal modus Du må oppdatere SageMaker SDK til den nyeste versjonen.

  • Kjør pip install sagemaker -Uq i terminalen.

Bare for koderedigering må du sette Python-miljøet til å kjøre i gjeldende terminal.

  • I Code Editor, på Fil-menyen¸ velg Preferanser og innstillinger.

Kjør Python-filer i SageMaker Studio-rom med lokal modus

  • Søk etter og velg Terminal: Kjør i File Dir.

Kjør Python-filer i SageMaker Studio-rom med lokal modus

  • I Code Editor eller JupyterLab åpner du scikit_learn_script_mode_local_training_and_serving mappen og kjør scikit_learn_script_mode_local_training_and_serving.py filen.

Du kan kjøre skriptet ved å velge Kjør i Code Editor eller ved å bruke CLI i en JupyterLab-terminal. Kjør Python-filer i SageMaker Studio-rom med lokal modus Kjør Python-filer i SageMaker Studio-rom med lokal modus Du vil kunne se hvordan modellen trenes lokalt. Deretter distribuerer du modellen til et SageMaker-endepunkt lokalt, og beregner rotmiddelkvadratfeilen (RMSE). Kjør Python-filer i SageMaker Studio-rom med lokal modus Kjør Python-filer i SageMaker Studio-rom med lokal modus

Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus

Du kan også bruke en notatbok i SageMaker Studio Classic til å kjøre en treningsjobb i liten skala CIFAR10 ved å bruke lokal modus, distribuer modellen lokalt og utfør inferens.

Sett opp notatboken

For å konfigurere den bærbare datamaskinen, fullfør følgende trinn:

  • Åpne SageMaker Studio Classic og klon følgende GitHub repo.

Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus

  • Åpne pytorch_local_mode_cifar10.ipynb notebook in blog/pytorch_cnn_cifar10.

Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus

  • Til Bilde, velg PyTorch 2.1.0 Python 3.10 CPU Optimized.

Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus Bekreft at notatboken viser riktig forekomst og kjernevalg. Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus

  • Åpne en terminal ved å velge Start Terminal i det gjeldende SageMaker-bildet.

Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus

  • Installer Plugin-modulen Docker CLI og Docker Compose ved å følge instruksjonene nedenfor GitHub repo.

Fordi du bruker Docker fra SageMaker Studio Classic, fjern sudo når du kjører kommandoer fordi terminalen allerede kjører under superbruker. For SageMaker Studio Classic avhenger installasjonskommandoene av SageMaker Studio-appbilde-operativsystemet. For eksempel er DLC-baserte rammeverksbilder Ubuntu-baserte, der følgende instruksjoner vil fungere. For et Debian-basert bilde som DataScience Images, må du imidlertid følge instruksjonene nedenfor GitHub repo. Hvis kjedede kommandoer mislykkes, kjør kommandoene én om gangen. Du bør se Docker-versjonen vises. Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus

  • La terminalvinduet være åpent, gå tilbake til notatboken og begynn å kjøre den celle for celle.

Sørg for å kjøre cellen med pip install -U sagemaker så du bruker den nyeste versjonen av SageMaker Python SDK.

Lokal trening

Når du begynner å kjøre den lokale SageMaker-treningsjobben, vil du se følgende logglinjer:

INFO:sagemaker.local.image:'Docker Compose' found using Docker CLI.
INFO:sagemaker.local.local_session:Starting training job

Dette indikerer at treningen kjørte lokalt ved hjelp av Docker.

Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus

Vær tålmodig mens pytorch-training:2.1-cpu-py310 Docker-bilde er trukket. På grunn av den store størrelsen (5.2 GB), kan det ta noen minutter.

Docker-bilder vil bli lagret i SageMaker Studio-appens rotvolum, som ikke er tilgjengelig for sluttbrukere. Den eneste måten å få tilgang til og samhandle med Docker-bilder er via de eksponerte Docker API-operasjonene.

Fra et brukerkonfidensialitetssynspunkt har SageMaker Studio-plattformen aldri tilgang til eller lagrer brukerspesifikke bilder.

Når opplæringen er fullført, vil du kunne se følgende suksesslogglinjer:

8zlz1zbfta-sagemaker-local exited with code 0
Aborting on container exit...
Container 8zlz1zbfta-sagemaker-local  Stopping
Container 8zlz1zbfta-sagemaker-local  Stopped
INFO:sagemaker.local.image:===== Job Complete =====

Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus

Lokal slutning

Fullfør følgende trinn:

  • Distribuer SageMaker-endepunktet ved å bruke SageMaker Local Mode.

Vær tålmodig mens pytorch-inference:2.1-cpu-py310 Docker-bilde er trukket. På grunn av den store størrelsen (4.32 GB), kan det ta noen minutter.

Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus

  • Påkall SageMaker-endepunktet som er distribuert lokalt ved å bruke testbildene.

Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus

Du vil kunne se de forutsagte klassene: frosk, skip, bil og fly:

Predicted:  frog ship  car plane

Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus

  • Fordi SageMaker Local-endepunktet fortsatt er oppe, naviger tilbake til det åpne terminalvinduet og lister opp de kjørende beholderne:

docker ps

Du vil kunne se løpingen pytorch-inference:2.1-cpu-py310 beholder som støtter SageMaker-endepunktet.

Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus

  • For å slå av SageMaker lokale endepunkt og stoppe den kjørende beholderen, fordi du bare kan kjøre ett lokalt endepunkt om gangen, kjør oppryddingskoden.

Simuler trening og slutninger i SageMaker Studio Classic ved å bruke lokal modus

  • For å være sikker på at Docker-beholderen er nede, kan du navigere til det åpnede terminalvinduet, kjøre docker ps og sørge for at det ikke er noen kjørende beholdere.
  • Hvis du ser en container kjører, løp docker stop <CONTAINER_ID> å stoppe det.

Tips for bruk av SageMaker Local Mode

Hvis du bruker SageMaker for første gang, se Trene maskinlæringsmodeller. For å lære mer om distribusjon av modeller for slutning med SageMaker, se Distribuer modeller for slutninger.

Husk følgende anbefalinger:

  • Skriv ut inn- og utdatafiler og mapper for å forstå datasett og modelllasting
  • Bruk 1–2 epoker og små datasett for rask testing
  • Forhåndsinstaller avhengigheter i en Dockerfile for å optimalisere miljøoppsettet
  • Isoler serialiseringskode i endepunkter for feilsøking

Konfigurer Docker-installasjon som en livssykluskonfigurasjon

Du kan definere Docker-installasjonsprosessen som et Lifecycle Configuration (LCC)-skript for å forenkle oppsettet hver gang en ny SageMaker Studio-plass starter. LCC-er er skript som SageMaker kjører under hendelser som romskaping. Referere til jupyter lab, Kodeditoreller SageMaker Studio Classic LCC-oppsett (ved hjelp av docker install cli som referanse) for å lære mer.

Konfigurer Docker-installasjon som en livssykluskonfigurasjon

Konfigurer Docker-installasjon som en livssykluskonfigurasjon

Bygg og test tilpassede Docker-bilder i SageMaker Studio-rom

I dette trinnet installerer du Docker inne i JupyterLab (eller Code Editor) appplass og bruker Docker til å bygge, teste og publisere tilpassede Docker-bilder med SageMaker Studio-rom. Plasser brukes til å administrere lagrings- og ressursbehovet til enkelte SageMaker Studio-applikasjoner. Hver plass har et 1:1 forhold til en forekomst av en applikasjon. Hver støttet applikasjon som opprettes får sin egen plass. For å lære mer om SageMaker-rom, se Øk produktiviteten på Amazon SageMaker Studio: Vi introduserer JupyterLab Spaces og generative AI-verktøy. Sørg for at du sørger for en ny plass med minst 30 GB lagringsplass for å tillate tilstrekkelig lagringsplass for Docker-bilder og artefakter.

Installer Docker inne i et mellomrom

For å installere pluginene Docker CLI og Docker Compose i et JupyterLab-rom, kjør kommandoene i følgende GitHub repo. SageMaker Studio støtter kun Docker versjon 20.10.X.

Bygg Docker-bilder

For å bekrefte at Docker er installert og fungerer inne i JupyterLab-plassen din, kjør følgende kode:

# to verify docker service
sagemaker-user@default:~$ docker version
Client: Docker Engine - Community
Version:           24.0.7
API version:       1.41 (downgraded from 1.43)
Go version:        go1.20.10
Git commit:        afdd53b
Built:             Thu Oct 26 09:07:41 2023
OS/Arch:           linux/amd64
Context:           default

Server:
Engine:
Version:          20.10.25
API version:      1.41 (minimum version 1.12)
Go version:       go1.20.10
Git commit:       5df983c
Built:            Fri Oct 13 22:46:59 2023
OS/Arch:          linux/amd64
Experimental:     false
containerd:
Version:          1.7.2
GitCommit:        0cae528dd6cb557f7201036e9f43420650207b58
runc:
Version:          1.1.7
GitCommit:        f19387a6bec4944c770f7668ab51c4348d9c2f38
docker-init:
Version:          0.19.0
GitCommit:        de40ad0

For å bygge et tilpasset Docker-bilde i et JupyterLab (eller Code Editor)-rom, fullfør følgende trinn:

  • Opprett en tom dockerfil:

touch Dockerfile

  • Rediger Dockerfilen med følgende kommandoer, som lager et enkelt flaskenettserverbilde fra basepython:3.10.13-bullseye-bildet som er vert på Docker hub:
# Use the specified Python base image
FROM python:3.10.13-bullseye

# Create a code dir
RUN mkdir /code/

# Set the working directory in the container
WORKDIR /code

# Upgrade pip and install required packages
RUN python3 -m pip install --upgrade pip && 
python3 -m pip install flask

# Copy the app.py file to the container
COPY app.py /code/

# Set the command to run the app
ENTRYPOINT ["python", "app.py"]

Følgende kode viser innholdet i et eksempel på en flaskeapplikasjonsfil app.py:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def hello():
return jsonify({"response": "Hello"})

if __name__ == '__main__':
app.run(host='0.0.0.0', port=6006)

I tillegg kan du oppdatere referanse Dockerfile-kommandoene til å inkludere pakker og artefakter etter eget valg.

  • Bygg et Docker-bilde ved å bruke referansen Dockerfile:

docker build --network sagemaker --tag myflaskapp:v1 --file ./Dockerfile .

inkluderer --network sagemaker i docker build-kommandoen din, ellers vil byggingen mislykkes. Beholdere kan ikke kjøres i Docker-standardbroen eller tilpassede Docker-nettverk. Beholdere kjøres i samme nettverk som SageMaker Studio-applikasjonsbeholderen. Brukere kan bare bruke sagemaker for nettverksnavnet.

  • Når bygget er fullført, valider om bildet eksisterer. Merk bygget på nytt som et ECR-bilde og trykk. Hvis du får tillatelsesproblemer, kjør kommandoen aws ecr get-login-password... og prøv å kjøre Docker push/pull på nytt:
sagemaker-user@default:~$ docker image list
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
myflaskapp      v1        d623f1538f20   27 minutes ago   489MB

sagemaker-user@default:~$ docker tag myflaskapp:v1 123456789012.dkr.ecr.us-east-2.amazonaws.com/myflaskapp:v1

sagemaker-user@default:~$ docker image list
REPOSITORY                                                  TAG       IMAGE ID       CREATED          SIZE
123456789012.dkr.ecr.us-east-2.amazonaws.com/myflaskapp     latest    d623f1538f20   27 minutes ago   489MB
myflaskapp                                                  v1        d623f1538f20   27 minutes ago   489MB

sagemaker-user@default:~$ aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

sagemaker-user@default:~$ docker push 123456789012.dkr.ecr.us-east-2.amazonaws.com/myflaskapp:latest

Test Docker-bilder

Å ha Docker installert inne i en JupyterLab (eller Code Editor) SageMaker Studio-plass lar deg teste forhåndsbygde eller tilpassede Docker-bilder som containere (eller containeriserte applikasjoner). I denne delen bruker vi docker run-kommandoen til å klargjøre Docker-beholdere inne i et SageMaker Studio-rom for å teste containeriserte arbeidsbelastninger som REST-webtjenester og Python-skript. Fullfør følgende trinn:

sagemaker-user@default:~$ docker image list
REPOSITORY                                                  TAG       IMAGE ID       CREATED       SIZE

  • Hvis testbildet ikke eksisterer, kjør docker pull for å trekke bildet inn på din lokale maskin:

sagemaker-user@default:~$ docker pull 123456789012.dkr.ecr.us-east-2.amazonaws.com/myflaskapp:v1

  • Hvis du støter på autentiseringsproblemer, kjør følgende kommandoer:

aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

  • Opprett en beholder for å teste arbeidsmengden din:

docker run --network sagemaker 123456789012.dkr.ecr.us-east-2.amazonaws.com/myflaskapp:v1

Dette spinner opp en ny containerforekomst og kjører applikasjonen som er definert ved hjelp av Dockers ENTRYPOINT:

sagemaker-user@default:~$ docker run --network sagemaker 905418447590.dkr.ecr.us-east-2.amazonaws.com/myflaskapp:v1
* Serving Flask app 'app'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:6006
* Running on http://169.255.255.2:6006

  • For å teste om nettendepunktet er aktivt, naviger til URL-en https://<sagemaker-space-id>.studio.us-east-2.sagemaker.aws/jupyterlab/default/proxy/6006/.

Du bør se et JSON-svar som ligner på følgende skjermbilde.

Konfigurer Docker-installasjon som en livssykluskonfigurasjon

Rydd opp

For å unngå unødvendige kostnader, slett ressursene du opprettet mens du kjørte eksemplene i dette innlegget:

  1. I ditt SageMaker Studio-domene velger du Ettromsleilighet Classic i navigasjonsruten, og velg deretter Stopp.
  2. I ditt SageMaker Studio-domene velger du jupyter lab or Kodeditor i navigasjonsruten, velg appen din, og velg deretter Stopp.

konklusjonen

SageMaker Studio Local Mode og Docker-støtte gir utviklere mulighet til å bygge, teste og iterere på ML-implementeringer raskere uten å forlate arbeidsområdet. Ved å gi umiddelbar tilgang til testmiljøer og utdata, optimerer disse egenskapene arbeidsflyter og forbedrer produktiviteten. Prøv SageMaker Studio Local Model og Docker-støtte ved å bruke vår rask funksjon ombord, som lar deg spinne opp et nytt domene for enkeltbrukere i løpet av minutter. Del dine tanker i kommentarfeltet!


Om forfatterne

Shweta SinghShweta Singh er senior produktsjef i Amazon SageMaker Machine Learning (ML)-plattformteamet hos AWS, og leder SageMaker Python SDK. Hun har jobbet i flere produktroller i Amazon i over 5 år. Hun har en bachelorgrad i datateknikk og mastergrad i finansteknikk, begge fra New York University

Eitan SelaEitan Sela er en generativ AI og maskinlæringsspesialistløsningsarkitekt for AWS. Han jobber med AWS-kunder for å gi veiledning og teknisk assistanse, og hjelpe dem med å bygge og drifte Generative AI og Machine Learning-løsninger på AWS. På fritiden liker Eitan å jogge og lese de siste maskinlæringsartiklene.

Pranav MurthyPranav Murthy er AI/ML Specialist Solutions Architect hos AWS. Han fokuserer på å hjelpe kunder med å bygge, trene, distribuere og migrere maskinlæring (ML) arbeidsbelastninger til SageMaker. Han har tidligere jobbet i halvlederindustrien med å utvikle modeller for store datasyn (CV) og naturlig språkbehandling (NLP) for å forbedre halvlederprosesser ved å bruke avanserte ML-teknikker. På fritiden liker han å spille sjakk og reise. Du kan finne Pranav på Linkedin.

Mufaddal RohawalaMufaddal Rohawala er programvareingeniør ved AWS. Han jobber på SageMaker Python SDK-biblioteket for Amazon SageMaker. På fritiden liker han å reise, utendørsaktiviteter og er en fotballfan.

spot_img

Siste etterretning

spot_img

Chat med oss

Hei der! Hvordan kan jeg hjelpe deg?