์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์„ฑ ๊ฐ’์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์˜จ๋ผ์ธ ์„œ๋น™์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์šฐ์„ ์‹œํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ŠคํŠธ๋ฆฌ๋ฐ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ Vertex AI Feature Store(๊ธฐ์กด)๋Š” ๋ช‡ ์ดˆ ๋‚ด์— ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์˜จ๋ผ์ธ ์ œ๊ณต ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑํ•„ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์ผ๊ด„์ ์œผ๋กœ ํŠน์„ฑ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๊ด„ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์š”์ฒญ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ์ผ๊ด„ ๊ฐ€์ ธ์˜ค๊ธฐ ์š”์ฒญ์€ ๋” ํฐ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์™„๋ฃŒ๋˜๋Š” ๋ฐ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ํŠน์„ฑ ๊ฐ’ ํƒ€์ž„์Šคํƒฌํ”„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ• ๋‹น๋Ÿ‰ ๋ฐ ํ•œ๋„์˜ Vertex AI Feature Store(๊ธฐ์กด)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ๋ฏธ๋ž˜์˜ ๋‚ ์งœ ๋˜๋Š” ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน์„ฑ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‚ฌ๋ก€

์˜จ๋ผ์ธ ์†Œ๋งค ์กฐ์ง์€ ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ํ™œ๋™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งž์ถค์„ค์ •๋œ ์‡ผํ•‘ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด ํ™œ๋™์„ ํ”ผ์ฒ˜์Šคํ† ์–ด์— ์บก์ฒ˜ํ•œ ํ›„ ๋ฐ”๋กœ ์˜จ๋ผ์ธ ์˜ˆ์ธก์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹ค์‹œ๊ฐ„ ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ์ œ๊ณต์„ ํ†ตํ•ด ์‡ผํ•‘ ์„ธ์…˜ ์ค‘์— ๊ณ ๊ฐ์—๊ฒŒ ์œ ์šฉํ•œ ๊ด€๋ จ ์ถ”์ฒœ ํ•ญ๋ชฉ์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜จ๋ผ์ธ ์Šคํ† ๋ฆฌ์ง€ ๋…ธ๋“œ ์‚ฌ์šฉ๋Ÿ‰

์˜จ๋ผ์ธ ์ €์žฅ์†Œ์— ํŠน์„ฑ ๊ฐ’์„ ์ž‘์„ฑํ•˜๋ฉด ํ”ผ์ฒ˜์Šคํ† ์–ด์˜ CPU ๋ฆฌ์†Œ์Šค(์˜จ๋ผ์ธ ์Šคํ† ๋ฆฌ์ง€ ๋…ธ๋“œ)๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. CPU ์‚ฌ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์ˆ˜์š”๊ฐ€ ๊ณต๊ธ‰์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์š”๊ฐ€ ๊ณต๊ธ‰์„ ์ดˆ๊ณผํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ๋ฅ ์ด ์•ฝ 70% ์ดํ•˜๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐ’์„ ์ •๊ธฐ์ ์œผ๋กœ ์ดˆ๊ณผํ•˜๋ฉด ํ”ผ์ฒ˜์Šคํ† ์–ด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋…ธ๋“œ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ž๋™ ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ”ผ์ฒ˜์Šคํ† ์–ด ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

ํŠน์ • ํŠน์„ฑ์— ๊ฐ’์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŠน์„ฑ ๊ฐ’์€ ๊ฐ€์ ธ์˜ค๊ธฐ ์š”์ฒญ์˜ ์ผ๋ถ€๋กœ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ์— ๋งŒ๋“  ๊ธฐ๋Šฅ์— ์“ฐ๋Š” ๊ฒฝ์šฐ ์ƒˆ ๊ธฐ๋Šฅ์ด ์•„์ง ์ „ํŒŒ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์“ฐ๊ธฐ ์ „์— ๋ช‡ ๋ถ„ ์ •๋„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด resource not found ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์“ฐ๊ธฐ๋‹น ํ•ญ๋ชฉ ํ•˜๋‚˜์˜ ํŠน์„ฑ ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ํ”„๋กœ์ ํŠธ ๋ฐ ๋ฆฌ์ „์˜ ๊ฒฝ์šฐ ์ตœ๋Œ€ 10๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ•ญ๋ชฉ ์œ ํ˜• ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์˜ ํŠน์„ฑ ๊ฐ’์„ ๋™์‹œ์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•œ๋„์—๋Š” ์ง€์ •๋œ ํ”„๋กœ์ ํŠธ์™€ ๋ฆฌ์ „์˜ ๋ชจ๋“  ํ”ผ์ฒ˜์Šคํ† ์–ด์— ๋Œ€ํ•œ ๋ชจ๋“  ์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์š”์ฒญ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด Vertex AI Feature Store(๊ธฐ์กด)์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์˜คํ”„๋ผ์ธ ์ €์žฅ์†Œ์— ์“ฐ์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Vertex AI Feature Store(๊ธฐ์กด)๊ฐ€ ๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ์— ์˜ค๋ฅ˜๋ฅผ ๋กœ๊น…ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•œ ์˜คํ”„๋ผ์ธ ์Šคํ† ๋ฆฌ์ง€ ์“ฐ๊ธฐ ์˜ค๋ฅ˜ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ฐธ์กฐํ•˜์„ธ์š”.

REST

๊ธฐ์กด ๊ธฐ๋Šฅ์˜ ํŠน์„ฑ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด featurestores.entityTypes.writeFeatureValues ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ POST ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ๋ฐ์ดํ„ฐ ์—ด๊ณผ ๋Œ€์ƒ ํŠน์„ฑ ID์˜ ์ด๋ฆ„์ด ๋‹ค๋ฅด๋ฉด sourceField ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. featurestores.entityTypes.writeFeatureValues๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ํŠน์„ฑ ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • LOCATION: ํ”ผ์ฒ˜์Šคํ† ์–ด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋ฆฌ์ „. ์˜ˆ๋ฅผ ๋“ค๋ฉด us-central1์ž…๋‹ˆ๋‹ค.
  • PROJECT: ํ”„๋กœ์ ํŠธ ID
  • FEATURESTORE_ID: ํ”ผ์ฒ˜์Šคํ† ์–ด์˜ ID
  • ENTITY_TYPE_ID: ํ•ญ๋ชฉ ์œ ํ˜•์˜ ID
  • FEATURE_ID: ๊ฐ’์„ ์ž‘์„ฑํ•  ํ”ผ์ฒ˜์Šคํ† ์–ด์˜ ๊ธฐ์กด ํŠน์„ฑ ID
  • VALUE_TYPE: ํŠน์„ฑ์˜ ๊ฐ’ ์œ ํ˜•
  • VALUE: ํŠน์„ฑ ๊ฐ’
  • TIME_STAMP(์„ ํƒ์‚ฌํ•ญ): ํŠน์„ฑ์ด ์ƒ์„ฑ๋œ ์‹œ๊ฐ„. ํƒ€์ž„์Šคํƒฌํ”„๋Š” RFC3339 UTC ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

HTTP ๋ฉ”์„œ๋“œ ๋ฐ URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID:writeFeatureValues

JSON ์š”์ฒญ ๋ณธ๋ฌธ:

{
  "payloads": [
    {
      "entityId": "ENTITY_ID",
      "featureValues": {
        "FEATURE_ID": {
          "VALUE_TYPE": VALUE,
          "metadata": {"generate_time": "TIME_STAMP"}
        }
      }
    }
  ]
}

์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

curl

์š”์ฒญ ๋ณธ๋ฌธ์„ request.json ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID:writeFeatureValues"

PowerShell

์š”์ฒญ ๋ณธ๋ฌธ์„ request.json ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID:writeFeatureValues" | Select-Object -Expand Content

์„ฑ๊ณต ์ƒํƒœ ์ฝ”๋“œ(2xx)์™€ ๋นˆ ์‘๋‹ต์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Python์šฉ Vertex AI SDK

Python์šฉ Vertex AI SDK๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Python์šฉ Vertex AI SDK ์„ค์น˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Python์šฉ Vertex AI SDK API ์ฐธ์กฐ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

from google.cloud import aiplatform


def write_feature_values_sample(
    project: str, location: str, entity_type_id: str, featurestore_id: str
):

    aiplatform.init(project=project, location=location)

    my_entity_type = aiplatform.featurestore.EntityType(
        entity_type_name=entity_type_id, featurestore_id=featurestore_id
    )

    my_data = {
        "movie_01": {
            "title": "The Shawshank Redemption",
            "average_rating": 4.7,
            "genre": "Drama",
        },
    }

    my_entity_type.write_feature_values(instances=my_data)

์ถ”๊ฐ€ ์–ธ์–ด

๋‹ค์Œ Vertex AI ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜์—ฌ Vertex AI API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Cloud ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ง€์›๋˜๋Š” ๊ฐ ์–ธ์–ด์˜ ๊ณ ์œ ํ•œ ๊ทœ์น™ ๋ฐ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”๋œ ๊ฐœ๋ฐœ์ž ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„