Υπολογισμός σε Δεδομένα του Ocean στο JupyterLab

Μια επίδειξη απομακρυσμένης εκτέλεσης αλγορίθμων υπολογισμού σε σύνολα δεδομένων

Το Ocean Protocol έχει δεσμευτεί να δώσει κίνητρα για την ανταλλαγή δεδομένων προς όφελος των επαγγελματιών της Επιστήμης Δεδομένων και της Τεχνητής Νοημοσύνης (AI). Με την αρχική έκδοση, ενεργοποιήσαμε τις πληρωμές και τις συμφωνίες παροχής υπηρεσιών που βασίζονται στο blockchain για τη διευκόλυνση της ανταλλαγής συνόλων δεδομένων σε ένα αυτοματοποιημένο σύστημα ελέγχου πρόσβασης που αξιοποιεί τα Έξυπνα Συμβόλαια του blockchain Ethereum.

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

Η κυκλοφορία v2 του Υπολογισμού Σε Δεδομένα του Ocean περιλαμβάνει ένα σύστημα γενικού σκοπού για την υποστήριξη της απομακρυσμένης εκτέλεσης υπολογιστικών αλγορίθμων σε σύνολα δεδομένων. Εδώ παρουσιάζουμε ένα παράδειγμα χρήσης αυτού του συστήματος σε περιβάλλον JupyterLab με τη χρήση ενός σημειωματάριου Python. Αυτό το παράδειγμα κάνει χρήση του squid-py SDK το οποίο υποστηρίζει όλα τα χαρακτηριστικά του Πρωτοκόλλου Ocean.

 Μία προηγούμενη ανάρτηση στο ιστολόγιο παρουσίασε τα βασικά στοιχεία του Manta Ray - Πρωτοκόλλου Ocean για Επιστήμονες Δεδομένων. Σε αυτή την ανάρτηση, θα επικεντρωθούμε στη λειτουργία Υπολογισμού σε Δεδομένα και θα επιδείξουμε μόνο μια συντομότερη έκδοση του πλήρους σημειωματάριου που βρίσκεται εδώ και μπορεί να εκτελεστεί σε ένα αντίγραφο του JupyterLab στη διεύθυνση datascience.oceanprotocol.com.


Ας εμβαθύνουμε

Ξεκινάμε με τη δημιουργία ενός αντίγραφου του Ocean και νέων λογαριασμών: ενός λογαριασμού εκδότη για τη δημοσίευση του συνόλου δεδομένων στο πρωτόκολλο Ocean ως νέου περιουσιακού στοιχείου και ενός λογαριασμού καταναλωτή για την παραγγελία της υπολογιστικής υπηρεσίας και την εκτέλεση του αλγορίθμου.

 from squid_py import Ocean, Config
 from mantaray_utilities.user import create_account

 configuration = Config(OCEAN_CONFIG_PATH
 ocn = Ocean(configuration
 
 # Δημιουργία νέων λογαριασμών για τον εκδότη και τον   καταναλωτή
 publisher_acct = create_account(faucet_url, wait=True)
 consumer_account = create_account(faucet_url, wait=True)

Δημοσίευση συνόλου δεδομένων με μια υπολογιστική υπηρεσία

Τώρα που έχουμε δημιουργήσει λογαριασμούς και έχουμε γεμίσει με μερικά ETH και OCEAN tokens, ας δημοσιεύσουμε ένα σύνολο δεδομένων με μια υπηρεσία υπολογισμού.

Πρώτον, ορίζουμε τα χαρακτηριστικά της υπηρεσίας υπολογισμού. Η υπηρεσία υπολογισμού διαχειρίζεται με τη χρήση ενός σμήνους Kubernetes και η πρόσβαση σε αυτήν γίνεται μέσω της Διεπαφής Προγραμματισμού Εφαρμογής (API) του Brizo, το οποίο είναι ο διακομιστής HTTP μεσολάβησης των παρόχων δεδομένων.

# Δημιουργία υπηρεσίας υπολογισμού για ενσωμάτωση στο περιουσιακό στοιχείο Εγγράφου αποκεντρωμένου αναγνωριστικού (DDO)
cluster = ocn.compute.build_cluster_attributes(
    'kubernetes',
    '/cluster/url'
)

containers = [ocn.compute.build_container_attributes(
    "tensorflow/tensorflow",
    "latest",    "sha256:cb57ecfa6ebbefd8ffc7f75c0f00e57a7fa739578a429b6f72a0df19315deadc")
]

servers = [ocn.compute.build_server_attributes(
     '1', 'xlsize', 16, 0, '16gb', '1tb', 2242244)]

provider_attributes = ocn.compute.build_service_provider_attributes(
    'Azure', 'Compute power 1', cluster, containers, servers
)

attributes = ocn.compute.create_compute_service_attributes(
    price=13,
    timeout=3600,
    creator=publisher_acct.address,
    date_published=get_timestamp(),
    provider_attributes=provider_attributes
)

service_endpoint = Brizo.get_compute_endpoint(ocn.config)
template_id = ocn.keeper.template_manager.create_template_id(                                                                                             
ocn.keeper.template_manager.SERVICE_TO_TEMPLATE_NAME['compute']
)

service_descriptor = ServiceDescriptor.compute_service_descriptor(
    attributes,
    service_endpoint,
    template_id
)

Το Brizo είναι ο πληρεξούσιος αντιπρόσωπος της υπηρεσίας παροχής (μία Διεπαφή Προγραμματισμού Εφαρμογής (API) του RESTful). Η δουλειά του είναι να εξυπηρετεί όλες τις αιτήσεις υπηρεσιών που σχετίζονται με δεδομένα.

Στη συνέχεια, δημιουργήστε το Περιουσιακό Στοιχείο συνόλου δεδομένων και καταχωρίστε το επί της αλυσίδας και στον χώρο αποθήκευσης μεταδεδομένων (Aquarius).

# Ανάκτηση Μεταδεδομένων από αρχείο
metadata = get_metadata_example()

ddo = ocn.assets.create(
    metadata,
    publisher_acct,
    [service_descriptor],
    providers=[provider_address],
    use_secret_store=False
)

# Επιβεβαίωση επιτυχής δημιουργίας περιουσιακού στοιχείου στον αποθηκευτικό χώρο μεταδεδομένων και επί της αλυσίδας  
asset = ocn.assets.resolve(ddo.did)
assert asset and asset.did == ddo.did

Ας ρίξουμε μια ματιά στα περιεχόμενα ενός ορισμού υπολογιστικής υπηρεσίας.

compute_service = ddo.get_service(ServiceTypes.CLOUD_COMPUTE)
pprint("Compute service definition: \n{}".format(json.dumps(compute_service.as_dictionary(), indent=2)))

>> Compute service definition: 
{
   "type": "compute",
   "serviceEndpoint": 
 "https://brizo.marketplace.dev-ocean.com/api/v1/brizo/services/compute",
   "attributes": {
     "main": {
       "name": "dataAssetComputingServiceAgreement",
       "creator": "0x3f4311103a92a6dE4647f56e9e585120caa821C7",
       "datePublished": "2020-05-27T20:49:20Z",
       "price": "13",
       "timeout": 3600,
       "provider": {
         "type": "Azure",
         "description": "Compute power 1",
         "environment": {
           "cluster": {
             "type": "kubernetes",
             "url": "/cluster/url"
           },
           "supportedContainers": [
             {
               "image": "tensorflow/tensorflow",
               "tag": "latest",
               "checksum": 
 "sha256:cb57ecfa6ebbefd8ffc7f75c0f00e57a7fa739578a429b6f72a0df19315deadc"
             }
           ],
           "supportedServers": [
             {
               "serverId": "1",
               "serverType": "xlsize",
               "cpu": 16,
               "gpu": 0,
               "memory": "16gb",
               "disk": "1tb",
               "maxExecutionTime": 2242244
             }
           ]
         }
       }
     },
    ...

Ένα πλήρες δείγμα μιας υπολογιστικής υπηρεσίας βρίσκεται στο squid-py.

Παραγγελία της υπηρεσίας υπολογισμού

Τώρα που το Περιουσιακό Στοιχείο συνόλου δεδομένων έχει δημοσιευτεί με την υπηρεσία υπολογισμού, ας δούμε πώς μπορείτε να παραγγείλετε την υπηρεσία υπολογισμού και να εκτελέσετε τον αλγόριθμο.

# Παραγγελία της υπηρεσίας υπολογισμού και υποβολή πληρωμής
agreement_id = ocn.compute.order(
    ddo.did,
    consumer_account,
    provider_address=provider_address
)

compute_approval_event = ocn.keeper.compute_execution_condition.subscribe_condition_fulfilled(
    agreement_id, 30, None, [], wait=True, from_block=0
)

Η λήψη του συμβάντος "compute_execution_condition" υποδεικνύει ότι ο πάροχος επιβεβαίωσε το αίτημα του χρήστη για την υπηρεσία υπολογισμού και ο χρήστης μπορεί να αρχίσει να εκτελεί εργασίες υπολογισμού.

Εκτέλεση του υπολογισμού

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

Εναλλακτικά, ο αλγόριθμος και τα μεταδεδομένα του μπορούν να δημοσιευθούν ως ένα Περιουσιακό Στοιχείο στο Πρωτόκολλο Ocean, όπως και η δημοσίευση του συνόλου δεδομένων παραπάνω. Η εκτέλεση ενός δημοσιευμένου αλγορίθμου απαιτεί μόνο την αποστολή του αναγνωριστικού του αλγορίθμου (το Asset DID), βλέπε squid-py.

# Προετοιμασία του σκριπτ αλγορίθμου και της περιγραφής
algorithm_text = get_algorithm_example()

# Κατασκευή του αντικειμένου μεταδεδομενων αλγορίθμου
algorithm_meta = AlgorithmMetadata(
    {
        'language': 'python',
        'rawcode': algorithm_text,
        'container': {
            'tag': 'latest',
            'image': 'amancevice/pandas',
            'entrypoint': 'python $ALGO'
        }
    }
)

Η μακροεντολή "ALGO" στην ιδιότητα entrypoint αντικαθίσταται από τη διαδρομή του εκτελέσιμου αλγορίθμου.

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

job_id = ocn.compute.start(
    agreement_id, 
    ddo.did, 
    consumer_account, 
    algorithm_meta=algorithm_meta
)

Η παραπάνω αίτηση start compute θα επιστρέψει ένα job_id το οποίο μπορεί να χρησιμοποιηθεί για να ζητήσετε πληροφορίες κατάστασης και αποτελεσμάτων σχετικά με την εκτελούμενη εργασία.

status = ocn.compute.status(agreement_id, job_id, consumer_account)

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

Τέλος, τα αποτελέσματα είναι έτοιμα.

result = ocn.compute.result(agreement_id, job_id, consumer_account)
print(f'The result is here: {result.get('urls')[0]})

Τα παραπάνω url των αποτελεσμάτων μπορούν να χρησιμοποιηθούν για να κατεβάσετε απευθείας τα αρχεία των αποτελεσμάτων.

Μπορείτε να δοκιμάσετε το παράδειγμα του σημειωματάριου στη διεύθυνση datascience.oceanprotocol.com. Συνδεθείτε με το λογαριασμό σας στο github, και μόλις φορτώσει το JupyterLab, ανοίξτε το σημειωματάριο s05_compute_to_data και διασκεδάστε.


Ακολουθήστε το Ocean Protocol στο Twitter, το Telegram, το LinkedIn, το GitHub και το Newsletter για ενημερώσεις και ανακοινώσεις σχετικά με το έργο. Και συνομιλήστε απευθείας με άλλους προγραμματιστές στο Gitter.

Ευχαριστούμε τον Manan Patel.


Πρωτότυπο Άρθρο (Αγγλική): Ocean Compute-to-Data in JupyterLab

Συντάκτης Πρωτότυπου Άρθρου: Samer Sallam

Ημερομηνία Συγγραφής Πρωτότυπου Άρθρου: 04 Ιουνίου 2020