Νοημοσύνη δεδομένων Πλάτωνα.
Κάθετη Αναζήτηση & Αι.

Δημιουργήστε αγωγούς κατασκευής μοντέλων Amazon SageMaker και αναπτύξτε μοντέλα R χρησιμοποιώντας το RStudio στο Amazon SageMaker

Ημερομηνία:

Τον Νοέμβριο του 2021, σε συνεργασία με RStudio PBC, Έχουμε ανακοίνωσε τη γενική διαθεσιμότητα RStudio στο Amazon SageMaker, το πρώτο πλήρως διαχειριζόμενο RStudio Workbench IDE του κλάδου στο cloud. Τώρα μπορείτε να φέρετε την τρέχουσα άδεια RStudio για να μεταφέρετε εύκολα τα αυτοδιαχειριζόμενα περιβάλλοντα RStudio σας σε Amazon Sage Maker με λίγα απλά βήματα.

Το RStudio είναι ένα από τα πιο δημοφιλή IDE μεταξύ R προγραμματιστών για έργα μηχανικής μάθησης (ML) και επιστήμης δεδομένων. Το RStudio παρέχει εργαλεία ανοιχτού κώδικα για R και επαγγελματικό λογισμικό έτοιμο για επιχειρήσεις για ομάδες επιστήμης δεδομένων για να αναπτύξουν και να μοιραστούν τη δουλειά τους στον οργανισμό. Η εισαγωγή του RStudio στο SageMaker όχι μόνο σας δίνει πρόσβαση στην υποδομή AWS με έναν πλήρως διαχειριζόμενο τρόπο, αλλά σας παρέχει επίσης εγγενή πρόσβαση στο SageMaker.

Σε αυτήν την ανάρτηση, διερευνούμε πώς μπορείτε να χρησιμοποιήσετε τις δυνατότητες του SageMaker μέσω του RStudio στο SageMaker για να δημιουργήσετε έναν αγωγό SageMaker που δημιουργεί, επεξεργάζεται, εκπαιδεύει και καταχωρεί τα μοντέλα R σας. Εξερευνούμε επίσης χρησιμοποιώντας το SageMaker για την ανάπτυξη του μοντέλου μας, όλα χρησιμοποιώντας το R.

Επισκόπηση λύσεων

Το παρακάτω διάγραμμα δείχνει την αρχιτεκτονική που χρησιμοποιείται στη λύση μας. Όλος ο κώδικας που χρησιμοποιείται σε αυτό το παράδειγμα βρίσκεται στο Αποθετήριο GitHub.

Προϋποθέσεις

Για να ακολουθήσετε αυτήν την ανάρτηση, απαιτείται πρόσβαση στο RStudio στο SageMaker. Εάν είστε νέοι στη χρήση του RStudio στο SageMaker, ελέγξτε Ξεκινήστε με το RStudio στο Amazon SageMaker.

Πρέπει επίσης να δημιουργήσουμε προσαρμοσμένα κοντέινερ Docker. Χρησιμοποιούμε AWS CodeBuild για την κατασκευή αυτών των δοχείων, οπότε χρειάζεστε μερικά επιπλέον Διαχείριση ταυτότητας και πρόσβασης AWS δικαιώματα (IAM) που μπορεί να μην έχετε από προεπιλογή. Πριν προχωρήσετε, βεβαιωθείτε ότι ο ρόλος IAM που χρησιμοποιείτε έχει μια πολιτική εμπιστοσύνης με το CodeBuild:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "codebuild.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Τα ακόλουθα δικαιώματα απαιτούνται επίσης στον ρόλο IAM για την εκτέλεση μιας έκδοσης στο CodeBuild και την προώθηση της εικόνας Μητρώο εμπορευματοκιβωτίων Amazon Elastic (Amazon ECR):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codebuild:DeleteProject",
                "codebuild:CreateProject",
                "codebuild:BatchGetBuilds",
                "codebuild:StartBuild"
            ],
            "Resource": "arn:aws:codebuild:*:*:project/sagemaker-studio*"
        },
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogStream",
            "Resource": "arn:aws:logs:*:*:log-group:/aws/codebuild/sagemaker-studio*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:GetLogEvents",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:log-group:/aws/codebuild/sagemaker-studio*:log-stream:*"
        },
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:CreateRepository",
                "ecr:BatchGetImage",
                "ecr:CompleteLayerUpload",
                "ecr:DescribeImages",
                "ecr:DescribeRepositories",
                "ecr:UploadLayerPart",
                "ecr:ListImages",
                "ecr:InitiateLayerUpload", 
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage"
            ],
            "Resource": "arn:aws:ecr:*:*:repository/sagemaker-studio*"
        },
        {
            "Sid": "ReadAccessToPrebuiltAwsImages",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": [
                "arn:aws:ecr:*:763104351884:repository/*",
                "arn:aws:ecr:*:217643126080:repository/*",
                "arn:aws:ecr:*:727897471807:repository/*",
                "arn:aws:ecr:*:626614931356:repository/*",
                "arn:aws:ecr:*:683313688378:repository/*",
                "arn:aws:ecr:*:520713654638:repository/*",
                "arn:aws:ecr:*:462105765813:repository/*"
            ]
        },
        {
            "Sid": "EcrAuthorizationTokenRetrieval",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
              "s3:GetObject",
              "s3:DeleteObject",
              "s3:PutObject"
              ],
            "Resource": "arn:aws:s3:::sagemaker-*/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:CreateBucket"
            ],
            "Resource": "arn:aws:s3:::sagemaker*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:GetRole",
                "iam:ListRoles"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::*:role/*",
            "Condition": {
                "StringLikeIfExists": {
                    "iam:PassedToService": "codebuild.amazonaws.com"
                }
            }
        }
    ]
}

Δημιουργήστε δοχεία R βάσης

Για να χρησιμοποιήσουμε τα σενάρια R για επεξεργασία και εκπαίδευση σε εργασίες επεξεργασίας και εκπαίδευσης του SageMaker, πρέπει να δημιουργήσουμε τις δικές μας Δοχεία υποδοχής που περιέχει τον απαραίτητο χρόνο εκτέλεσης και τα πακέτα. Η δυνατότητα χρήσης του δικού σας κοντέινερ, που αποτελεί μέρος της προσφοράς SageMaker, δίνει μεγάλη ευελιξία στους προγραμματιστές και τους επιστήμονες δεδομένων να χρησιμοποιούν τα εργαλεία και τα πλαίσια της επιλογής τους, χωρίς ουσιαστικά περιορισμούς.

Δημιουργούμε δύο κοντέινερ Docker με δυνατότητα R: ένα για επεξεργασία εργασιών και ένα για εκπαίδευση και ανάπτυξη των μοντέλων μας. Η επεξεργασία δεδομένων απαιτεί συνήθως διαφορετικά πακέτα και βιβλιοθήκες από τη μοντελοποίηση, επομένως είναι λογικό εδώ να διαχωρίσουμε τα δύο στάδια και να χρησιμοποιήσουμε διαφορετικά κοντέινερ.

Για περισσότερες λεπτομέρειες σχετικά με τη χρήση κοντέινερ με το SageMaker, ανατρέξτε στο Χρήση δοχείων Docker με το SageMaker.

Το δοχείο που χρησιμοποιείται για την επεξεργασία ορίζεται ως εξής:

FROM public.ecr.aws/docker/library/r-base:4.1.2

# Install tidyverse
RUN apt update && apt-get install -y --no-install-recommends 
    r-cran-tidyverse
    
RUN R -e "install.packages(c('rjson'))"

ENTRYPOINT ["Rscript"]

Για αυτήν την ανάρτηση, χρησιμοποιούμε ένα απλό και σχετικά ελαφρύ δοχείο. Ανάλογα με τις ανάγκες σας ή του οργανισμού σας, μπορεί να θέλετε να προεγκαταστήσετε πολλά ακόμη πακέτα R.

Το δοχείο που χρησιμοποιείται για εκπαίδευση και ανάπτυξη ορίζεται ως εξής:

FROM public.ecr.aws/docker/library/r-base:4.1.2

RUN apt-get -y update && apt-get install -y --no-install-recommends 
    wget 
    apt-transport-https 
    ca-certificates 
    libcurl4-openssl-dev 
    libsodium-dev
    
RUN apt-get update && apt-get install -y python3-dev python3-pip 
RUN pip3 install boto3
RUN R -e "install.packages(c('readr','plumber', 'reticulate'),dependencies=TRUE, repos='http://cran.rstudio.com/')"

ENV PATH="/opt/ml/code:${PATH}"

WORKDIR /opt/ml/code

COPY ./docker/run.sh /opt/ml/code/run.sh
COPY ./docker/entrypoint.R /opt/ml/entrypoint.R

RUN /bin/bash -c 'chmod +x /opt/ml/code/run.sh'

ENTRYPOINT ["/bin/bash", "run.sh"]

Ο πυρήνας RStudio εκτελείται σε ένα κοντέινερ Docker, επομένως δεν θα μπορείτε να δημιουργήσετε και να αναπτύξετε τα κοντέινερ χρησιμοποιώντας εντολές Docker απευθείας στην περίοδο λειτουργίας του Studio. Αντίθετα, μπορείτε να χρησιμοποιήσετε την πολύ χρήσιμη βιβλιοθήκη sagemaker-studio-image-build, το οποίο ουσιαστικά αναθέτει την εργασία της κατασκευής κοντέινερ στο CodeBuild.

Με τις ακόλουθες εντολές, δημιουργούμε δύο μητρώα Amazon ECR: sagemaker-r-processing και sagemaker-r-train-n-deployκαι δημιουργήστε τα αντίστοιχα κοντέινερ που χρησιμοποιούμε αργότερα:

if (!py_module_available("sagemaker-studio-image-build")){py_install("sagemaker-studio-image-build", pip=TRUE)}
system("cd pipeline-example ; sm-docker build . —file ./docker/Dockerfile-train-n-deploy —repository sagemaker-r-train-and-deploy:1.0")
system("cd pipeline-example ; sm-docker build . —file ./docker/Dockerfile-processing —repository sagemaker-r-processing:1.0")

Δημιουργήστε τον αγωγό

Τώρα που τα κοντέινερ είναι κατασκευασμένα και έτοιμα, μπορούμε να δημιουργήσουμε τη διοχέτευση SageMaker που ενορχηστρώνει τη ροή εργασιών κατασκευής του μοντέλου. Ο πλήρης κώδικας αυτού βρίσκεται κάτω από το αρχείο pipeline.R στο αποθετήριο. Ο ευκολότερος τρόπος για να δημιουργήσετε μια διοχέτευση SageMaker είναι χρησιμοποιώντας το SageMaker SDK, το οποίο είναι μια βιβλιοθήκη Python στην οποία μπορούμε να έχουμε πρόσβαση χρησιμοποιώντας τη βιβλιοθήκη δικτυώ. Αυτό μας δίνει πρόσβαση σε όλες τις λειτουργίες του SageMaker χωρίς να φύγουμε από το περιβάλλον της γλώσσας R.

Ο αγωγός που κατασκευάζουμε έχει τα ακόλουθα στοιχεία:

  • Βήμα προεπεξεργασίας – Αυτή είναι μια εργασία επεξεργασίας του SageMaker (χρησιμοποιώντας το sagemaker-r-processing container) υπεύθυνος για την προεπεξεργασία των δεδομένων και τον διαχωρισμό των δεδομένων σε σύνολα δεδομένων αμαξοστοιχίας και δοκιμής.
  • Βήμα εκπαίδευσης – Αυτή είναι μια εργασία εκπαίδευσης του SageMaker (χρησιμοποιώντας το sagemaker-r-train-n-deploy δοχείο) υπεύθυνος για την εκπαίδευση του μοντέλου. Σε αυτό το παράδειγμα, εκπαιδεύουμε ένα απλό γραμμικό μοντέλο.
  • Βήμα αξιολόγησης – Αυτή είναι μια εργασία επεξεργασίας του SageMaker (χρησιμοποιώντας το sagemaker-r-processing δοχείο) υπεύθυνος για την αξιολόγηση του μοντέλου. Συγκεκριμένα σε αυτό το παράδειγμα, μας ενδιαφέρει το RMSE (root mean square error) στο δοκιμαστικό σύνολο δεδομένων, το οποίο θέλουμε να χρησιμοποιήσουμε στο επόμενο βήμα καθώς και να συσχετίσουμε με το ίδιο το μοντέλο.
  • Βήμα υπό όρους – Αυτό είναι ένα βήμα υπό όρους, εγγενές στους αγωγούς SageMaker, που μας επιτρέπει να διακλαδίσουμε τη λογική του αγωγού με βάση κάποια παράμετρο. Σε αυτήν την περίπτωση, ο αγωγός διακλαδίζεται με βάση την τιμή του RMSE που υπολογίζεται στο προηγούμενο βήμα.
  • Εγγραφή βήματος μοντέλου – Εάν το προηγούμενο βήμα υπό όρους είναι True, και η απόδοση του μοντέλου είναι αποδεκτή, τότε το μοντέλο καταχωρείται στο μητρώο μοντέλου. Για περισσότερες πληροφορίες, ανατρέξτε στο Εγγραφή και ανάπτυξη μοντέλων με Μητρώο μοντέλων.

Πρώτα καλέστε τη συνάρτηση upsert για να δημιουργήσετε (ή να ενημερώσετε) τη διοχέτευση και, στη συνέχεια, καλέστε τη συνάρτηση έναρξης για να ξεκινήσει πραγματικά η εκτέλεση του αγωγού:

source("pipeline-example/pipeline.R")
my_pipeline <- get_pipeline(input_data_uri=s3_raw_data)

upserted <- my_pipeline$upsert(role_arn=role_arn)
started <- my_pipeline$start()

Επιθεωρήστε το μητρώο αγωγών και μοντέλων

Ένα από τα σπουδαία πράγματα σχετικά με τη χρήση του RStudio στο SageMaker είναι ότι με το να είστε στην πλατφόρμα SageMaker, μπορείτε να χρησιμοποιήσετε το σωστό εργαλείο για τη σωστή δουλειά και να κάνετε γρήγορη εναλλαγή μεταξύ τους με βάση αυτό που πρέπει να κάνετε.

Μόλις ξεκινήσουμε τη λειτουργία του αγωγού, μπορούμε να μεταβούμε σε Στούντιο Amazon SageMaker, το οποίο μας επιτρέπει να οπτικοποιούμε τον αγωγό και να παρακολουθούμε τις τρέχουσες και προηγούμενες εκτελέσεις του.

Για να δείτε λεπτομέρειες σχετικά με τον αγωγό που μόλις δημιουργήσαμε και εκτελέσαμε, μεταβείτε στη διεπαφή Studio IDE και επιλέξτε Πόροι SageMaker, επιλέξτε Αγωγοί στο αναπτυσσόμενο μενού και επιλέξτε τη διοχέτευση (σε αυτήν την περίπτωση, AbalonePipelineUsingR).

Αυτό αποκαλύπτει λεπτομέρειες του αγωγού, συμπεριλαμβανομένων όλων των τρεχουσών και προηγούμενων εκτελέσεων. Επιλέξτε το πιο πρόσφατο για να εμφανίσετε μια οπτική αναπαράσταση του αγωγού, σύμφωνα με το παρακάτω στιγμιότυπο οθόνης.

Το DAG του αγωγού δημιουργείται αυτόματα από την υπηρεσία με βάση τις εξαρτήσεις δεδομένων μεταξύ των βημάτων, καθώς και με βάση προσαρμοσμένες εξαρτήσεις που προστέθηκαν (δεν προστέθηκαν σε αυτό το παράδειγμα).

Όταν ολοκληρωθεί η εκτέλεση, εάν είναι επιτυχής, θα πρέπει να δείτε όλα τα βήματα να γίνονται πράσινα.

Επιλέγοντας οποιοδήποτε από τα μεμονωμένα βήματα εμφανίζονται λεπτομέρειες σχετικά με το συγκεκριμένο βήμα, συμπεριλαμβανομένων των εισόδων, των εξόδων, των αρχείων καταγραφής και των αρχικών ρυθμίσεων διαμόρφωσης. Αυτό σας επιτρέπει να διερευνήσετε τυχόν αποτυχημένα βήματα.

Ομοίως, όταν η διοχέτευση τελειώσει η εκτέλεση, ένα μοντέλο αποθηκεύεται στο μητρώο μοντέλων. Για πρόσβαση σε αυτό, στο Πόροι SageMaker παράθυρο, επιλέξτε Μητρώο μοντέλων στο αναπτυσσόμενο μενού και επιλέξτε το μοντέλο σας. Αυτό αποκαλύπτει τη λίστα με τα καταχωρημένα μοντέλα, όπως φαίνεται στο παρακάτω στιγμιότυπο οθόνης. Επιλέξτε ένα για να ανοίξετε τη σελίδα λεπτομερειών για τη συγκεκριμένη έκδοση μοντέλου.

Αφού ανοίξετε μια έκδοση του μοντέλου, επιλέξτε Ενημέρωση κατάστασης και Εγκρίνω για την έγκριση του μοντέλου.

Σε αυτό το σημείο, με βάση την περίπτωση χρήσης σας, μπορείτε να ρυθμίσετε αυτήν την έγκριση για να ενεργοποιήσετε περαιτέρω ενέργειες, συμπεριλαμβανομένης της ανάπτυξης του μοντέλου σύμφωνα με τις ανάγκες σας.

Ανάπτυξη του μοντέλου χωρίς διακομιστή

Αφού εκπαιδεύσετε και καταχωρήσετε ένα μοντέλο στο SageMaker, η ανάπτυξη του μοντέλου στο SageMaker είναι απλή.

Υπάρχουν πολλές επιλογές για το πώς μπορείτε να αναπτύξετε ένα μοντέλο, όπως συμπέρασμα παρτίδας, τελικά σημεία σε πραγματικό χρόνο ή ασύγχρονα τελικά σημεία. Κάθε μέθοδος συνοδεύεται από πολλές απαιτούμενες διαμορφώσεις, συμπεριλαμβανομένης της επιλογής του τύπου εμφάνισης που θέλετε καθώς και του μηχανισμού κλιμάκωσης.

Για αυτό το παράδειγμα, χρησιμοποιούμε την πρόσφατα ανακοινωθείσα δυνατότητα του SageMaker, Συμπεράσματα χωρίς διακομιστή (σε λειτουργία προεπισκόπησης από τη στιγμή της σύνταξης), για να αναπτύξουμε το R μοντέλο μας σε ένα τελικό σημείο χωρίς διακομιστή. Για αυτόν τον τύπο τερματικού σημείου, ορίζουμε μόνο την ποσότητα μνήμης RAM που θέλουμε να εκχωρηθεί στο μοντέλο για συμπέρασμα, καθώς και τον μέγιστο αριθμό επιτρεπόμενων ταυτόχρονων κλήσεων του μοντέλου. Το SageMaker φροντίζει για τη φιλοξενία του μοντέλου και την αυτόματη κλιμάκωση όπως απαιτείται. Χρεώνεστε μόνο για τον ακριβή αριθμό δευτερολέπτων και δεδομένων που χρησιμοποιεί το μοντέλο, χωρίς κόστος για το χρόνο αδράνειας.

Μπορείτε να αναπτύξετε το μοντέλο σε ένα τελικό σημείο χωρίς διακομιστή με τον ακόλουθο κώδικα:

model_package_arn <- 'ENTER_MODEL_PACKAGE_ARN_HERE'
model <- sagemaker$ModelPackage(
                        role=role_arn, 
                        model_package_arn=model_package_arn, 
                        sagemaker_session=session)
serverless_config <- sagemaker$serverless$ServerlessInferenceConfig(
                        memory_size_in_mb=1024L, 
                        max_concurrency=5L)
model$deploy(serverless_inference_config=serverless_config, 
             endpoint_name="serverless-r-abalone-endpoint")

Αν δείτε το σφάλμα ClientError: An error occurred (ValidationException) when calling the CreateModel operation: Invalid approval status "PendingManualApproval" το μοντέλο που θέλετε να αναπτύξετε δεν έχει εγκριθεί. Ακολουθήστε τα βήματα από την προηγούμενη ενότητα για να εγκρίνετε το μοντέλο σας.

Επικαλέστε το τελικό σημείο στέλνοντας ένα αίτημα στο τελικό σημείο HTTP που αναπτύξαμε ή χρησιμοποιήστε το SageMaker SDK. Στον ακόλουθο κώδικα, καλούμε το τελικό σημείο σε ορισμένα δεδομένα δοκιμής:

library(jsonlite)
x = list(features=format_csv(abalone_t[1:3,1:11]))
x = toJSON(x)

# test the endpoint
predictor <- sagemaker$predictor$Predictor(endpoint_name="serverless-r-abalone-endpoint", sagemaker_session=session)
predictor$predict(x)

Το τελικό σημείο που χρησιμοποιήσαμε ήταν ένα τελικό σημείο χωρίς διακομιστή και ως εκ τούτου χρεωνόμαστε για την ακριβή διάρκεια και τα δεδομένα που χρησιμοποιήθηκαν. Μπορεί να παρατηρήσετε ότι την πρώτη φορά που επικαλείτε το τελικό σημείο χρειάζεται περίπου ένα δευτερόλεπτο για να απαντηθεί. Αυτό οφείλεται στην ψυχρή ώρα έναρξης του τερματικού σημείου χωρίς διακομιστή. Εάν κάνετε άλλη επίκληση αμέσως μετά, το μοντέλο επιστρέφει την πρόβλεψη σε πραγματικό χρόνο επειδή είναι ήδη ζεστό.

Όταν ολοκληρώσετε τον πειραματισμό με το τελικό σημείο, μπορείτε να το διαγράψετε με την ακόλουθη εντολή:

predictor$delete_endpoint(delete_endpoint_config=TRUE)

Συμπέρασμα

Σε αυτήν την ανάρτηση, προχωρήσαμε στη διαδικασία δημιουργίας μιας διοχέτευσης SageMaker χρησιμοποιώντας το R στο περιβάλλον RStudio μας και παρουσιάσαμε πώς να αναπτύξουμε το μοντέλο R σε ένα τελικό σημείο χωρίς διακομιστή στο SageMaker χρησιμοποιώντας το μητρώο μοντέλων SageMaker.

Με τον συνδυασμό του RStudio και του SageMaker, μπορείτε τώρα να δημιουργήσετε και να ενορχηστρώσετε πλήρεις ροές εργασίας ML από άκρο σε άκρο στο AWS χρησιμοποιώντας την προτιμώμενη γλώσσα επιλογής μας, R.

Για να εμβαθύνετε σε αυτήν τη λύση, σας ενθαρρύνω να διαβάσετε τον πηγαίο κώδικα αυτής της λύσης, καθώς και άλλα παραδείγματα, στο GitHub.


Σχετικά με το Συγγραφέας

Γεώργιος Σχινάς είναι Ειδικός Αρχιτέκτονας Λύσεων για AI/ML στην περιοχή EMEA. Έχει έδρα στο Λονδίνο και συνεργάζεται στενά με πελάτες στο Ηνωμένο Βασίλειο και την Ιρλανδία. Ο Georgios βοηθά τους πελάτες να σχεδιάσουν και να αναπτύξουν εφαρμογές μηχανικής εκμάθησης στην παραγωγή σε AWS με ιδιαίτερο ενδιαφέρον για τις πρακτικές MLOps και δίνοντας τη δυνατότητα στους πελάτες να εκτελούν μηχανική εκμάθηση σε κλίμακα. Στον ελεύθερο χρόνο του, του αρέσει να ταξιδεύει, να μαγειρεύει και να περνά χρόνο με φίλους και οικογένεια.

spot_img

Τελευταία Νοημοσύνη

spot_img

Συνομιλία με μας

Γεια σου! Πώς μπορώ να σε βοηθήσω?