Export a spuštění trénovaného mozku


  • Celková doba dokončení:15 minut
  • Aktivní čas:10 minut
  • Čas exportu:5 minut

Pomocí funkce export brain zabalte trénovaný mozek jako kontejnerizovanou službu, která může běžet kdekoli, kde je Docker nainstalovaný, včetně místního počítače.

Poznámka

Bonsai export podporuje následující architektury procesorů:

  • x64:Systémy AMD a Intel na 64bitovém nebo 32bitovém hardwaru (systémy Linux pro obecné účely)
  • arm64 (v8):64bitové systémy RISC (Raspberry Pi 3+, Linux, novější průmyslové systémy)
  • arm32 (v7):32bitové systémy RISC (Raspberry Pi 1, Raspberry Pi 2, Linux, starší průmyslové systémy)

Než začnete

  • Musíte mít nainstalované Rozhraní příkazového řádku Azure.
  • Na místním počítači musíte mít nainstalovaný Docker. Komunitní edice Dockeru je dostupná pro Windows, Linuxa MacOS.
  • Ke čtení a zápisu musíte mít Azure Container Registry (ACR). Bonsai poskytuje výchozí ACR při zřizování pracovního prostoru ve stejné skupině prostředků jako pracovní prostor.
  • Musíte mít dokončený plně natrénovaný mozek.

Krok 1: Export mozku jako image Dockeru

  1. Přihlaste se k Bonsai UI .
  2. Vyberte mozek a verzi, se kterou chcete pracovat.
  3. Přejděte na panel Train (Trénovat).
  4. Klikněte na tlačítko Export brain (Exportovat mozek).
  5. V dialogovém okně, které se otevře:
    • Zadejte název vyexportovaného mozku.
    • Vyberte architekturu procesoru, na které bude mozek běžet.

Export mozku

Snímek obrazovky s panelem pro export mozku Bonsai a vybranou architekturou x64

Obrázek exportovaného mozku se zabalí jako kontejner Dockeru, uloží se do ACR přidruženého k vašemu pracovnímu prostoru a přidá se do seznamu dostupných mozku v části Exported Brains (Exportovaný mozek) v nabídce vlevo.

Bonsai zobrazí exportovaný mozek podle názvu, který přiřadíte během exportu. Úplný název image v ACR BRAIN_NAME:VERSION-OS_TYPE-ARCHITECTURE je, kde:

  • BRAIN_NAME je lidsky čitelný název přiřazený mozku během exportu.
  • VERZE je verze mozku, kterou jste se rozhodli exportovat.
  • OS_TYPE je operační systém nastavený během exportu.
  • ARCHITEKTURA je architektura procesoru, kterou jste vybrali během exportu.

Krok 2: Stažení a spuštění kontejneru Dockeru

Stažení exportovaného mozku:

  1. Přihlaste se k Azure Container Registry pomocí Azure CLI:
    az login
    az acr login --name ACR_NAME
    
  2. Načíst kontejnerizovaný obrázek mozku a uložit ho do místního počítače:
    docker pull \
      WORKSPACE_NAME.azurecr.io/WORKSPACE_ID/BRAIN_NAME:VERSION-OS_TYPE-ARCHITECTURE
    
  3. Spusťte kontejner jako místní server:
    docker run              \
      --detach              \
      --publish 5000:5000   \
      --name CONTAINER_NAME \
      WORKSPACE_NAME.azurecr.io/WORKSPACE_ID/BRAIN_NAME:VERSION-OS_TYPE-ARCHITECTURE
    
  • ACR_NAME: Název vaší instance Azure Container Registry (ACR).
  • WORKSPACE_NAME:Název, který jste dali pracovnímu prostoru při jeho zřízení.
  • WORKSPACE_ID:ID prostředku vašeho pracovního prostoru přiřazené Azure.
  • CONTAINER_NAME:Lidsky čitelný název místního kontejneru Dockeru.

Příznak detach spustí kontejner na pozadí, aniž by blokoval váš terminál. Příznak sděluje Dockeru, že má směrovat provoz na publish portu 5000 kontejneru na port 5000 na místním počítači ( localhost:5000 ).

Tip

Příkazy pro stažení a spuštění můžete zkopírovat a všechny zástupné symboly automaticky vyplníte z uživatelského Bonsai rozhraní:

  1. Klikněte na nabídku možností (...) vedle vyexportovaného mozku, který chcete stáhnout.
  2. Vyberte Zobrazit informace o stažení a zobrazte příkazy Bash.

Krok 3: Kontrola stavu kontejneru

Stav místního kontejneru můžete zkontrolovat pomocí příkazu docker psdocker logs nebo .

Příkaz docker ps vypíše ve výchozím nastavení stav všech spuštěných kontejnerů.

Kontejnerizované mozeky, které fungují správně, se zobrazí se stavem "Up" a bude indikovat, jak dlouho je kontejner spuštěný:

> docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1310dba590e3        cfe62aa00691        "predict -m /saved_m…"   2 days ago          Up 34 hours         0.0.0.0:5000->5000/tcp   CONTAINER_NAME

Krok 4: Promluvte si s vyexportovaným mozkum

Jakmile je kontejner spuštěný, můžete s mozekem komunikovat programově pomocí rozhraní Brain API a portu 5000 místního hostitele ( ).

Předpokládejme například, že máte v souboru rukopisu následující definice:

inkling "2.0"

using Math
using Goal

# Pole and track constants
const TrackLength = 0.5
const MaxPoleAngle = (12 * Math.Pi) / 180

# State info from the simulator
type SimState {
  CartPosition: number,         # Position of cart in meters
  CartVelocity: number,         # Velocity of cart in meters/sec
  PoleAngle: number,            # Current angle of pole in radians
  PoleAngularVelocity: number, # Angular velocity of the pole in radians/sec
}

# Possible action results
type SimAction {
  # Amount of force in x direction to apply to the cart.
  Command: number<-1 .. 1>
}

# Define a concept graph with a single concept
graph (input: SimState): SimAction {
  concept BalancePole(input): SimAction {
    curriculum {
      source simulator (Action: SimAction): SimState {
        package "Cartpole"
      }

      # The objective of training is expressed as a goal with two
      # objectives: keep the pole from falling over and stay on the track
      goal (State: SimState) {
        avoid `Fall Over`:
          Math.Abs(State.pole_angle) in Goal.RangeAbove(MaxPoleAngle)
        avoid `Out Of Range`:
          Math.Abs(State.cart_position) in Goal.RangeAbove(TrackLength / 2)
      }
    }
  }
}

Vaše volání rozhraní API by vypadalo takhle:

import requests
import json

# General variables
url = "http://localhost:5000"
predictPath = "/v2/clients/{clientId}/predict"
headers = {
  "Content-Type": "application/json"
}

# Set a random UUID for the client.
# The same client ID will be used for every call
myClientId = str(uuid.uuid4())

# Build the endpoint reference
endpoint = url + predictPath.replace("{clientId}", myClientId)

# Set the request variables
requestBody = {
  "state": {
    "CartPosition": 3,
    "CartVelocity": 1.5,
    "PoleAngle": 0.75,
    "PoleAngularVelocity": 0.1
  }
}

# Send the POST request
response = requests.post(
            endpoint,
            data = json.dumps(requestBody),
            headers = headers
          )

# Extract the JSON response
prediction = response.json()

# Access the JSON result: full response object
print(prediction)

# Access the JSON result: all concepts
print(prediction['concepts'])

# Access the JSON result: specific field
print(prediction['concepts']['BalancePole']['action']['Command'])

Vaše volání rozhraní API by vypadalo takhle:

import requests
import json

# General variables
url = "http://localhost:5000"
predictionPath = "/v1/prediction"
headers = {
  "Content-Type": "application/json"
}

# Build the endpoint reference
endpoint = url + predictionPath

# Set the request variables
requestBody = {
  "CartPosition": 3,
  "CartVelocity": 1.5,
  "PoleAngle": 0.75,
  "PoleAngularVelocity": 0.1
}

# Send the POST request
response = requests.post(
            endpoint,
            data = json.dumps(requestBody),
            headers = headers
          )

# Extract the JSON response
prediction = response.json()

# Access the JSON result: full response object
print(prediction)

# Access the JSON result: specific field
print(prediction['Command'])

Tip

Kontejner bude pro váš mozek obsluhovat podrobnosti rozhraní API, včetně vašich vlastních požadavků a objektů odpovědi na adrese . http://localhost:5000/v1/doc/index.html

Krok 5: Vyčištění

Jakmile místně dokončíte práci s mozekem, zastavte kontejner Dockeru.

Pokud chcete zastavit mozek, pomocí docker ps příkazu získejte ID místního kontejneru a docker stop CONTAINER_ID zastavte přidružený kontejner.

> docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1310dba590e3        cfe62aa00691        "predict -m /saved_m…"   2 days ago          Up 34 hours         0.0.0.0:5000->5000/tcp   CONTAINER_NAME

> docker stop 1310dba590e3