90 lines
2.7 KiB
PowerShell
90 lines
2.7 KiB
PowerShell
param(
|
|
[string]$DockerHost = "ssh://docker-gpu.cin.su",
|
|
[string]$ComposeFile = "core/deploy/docker-gpu/embeddings/compose.yaml",
|
|
[string]$EnvFile = "core/deploy/docker-gpu/embeddings/.env.example",
|
|
[string]$BaseUrl = "http://docker-gpu.cin.su:8082",
|
|
[string]$ExpectedModel = "qwen3-embedding-0.6b",
|
|
[int]$WaitSeconds = 900,
|
|
[switch]$ConfigOnly,
|
|
[switch]$Pull,
|
|
[switch]$Down
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
if (-not (Test-Path -LiteralPath $ComposeFile)) {
|
|
throw "Compose file not found: $ComposeFile"
|
|
}
|
|
|
|
if (-not (Test-Path -LiteralPath $EnvFile)) {
|
|
throw "Env file not found: $EnvFile"
|
|
}
|
|
|
|
$composeArgs = @(
|
|
"--host", $DockerHost,
|
|
"compose",
|
|
"--env-file", $EnvFile,
|
|
"-f", $ComposeFile
|
|
)
|
|
|
|
if ($ConfigOnly) {
|
|
docker @composeArgs config
|
|
exit $LASTEXITCODE
|
|
}
|
|
|
|
if ($Down) {
|
|
docker @composeArgs down
|
|
exit $LASTEXITCODE
|
|
}
|
|
|
|
if ($Pull) {
|
|
docker @composeArgs pull
|
|
if ($LASTEXITCODE -ne 0) {
|
|
exit $LASTEXITCODE
|
|
}
|
|
}
|
|
|
|
docker @composeArgs up -d
|
|
if ($LASTEXITCODE -ne 0) {
|
|
exit $LASTEXITCODE
|
|
}
|
|
|
|
$deadline = [DateTimeOffset]::UtcNow.AddSeconds($WaitSeconds)
|
|
$lastError = ""
|
|
do {
|
|
try {
|
|
$health = Invoke-RestMethod -Method Get -Uri "$($BaseUrl.TrimEnd('/'))/health" -TimeoutSec 10
|
|
if ($health.status -eq "ok") {
|
|
$models = Invoke-RestMethod -Method Get -Uri "$($BaseUrl.TrimEnd('/'))/v1/models" -TimeoutSec 10
|
|
$modelIds = @($models.data | ForEach-Object { $_.id })
|
|
if ($modelIds -notcontains $ExpectedModel) {
|
|
throw "Expected model '$ExpectedModel' is absent. Loaded: $($modelIds -join ', ')"
|
|
}
|
|
|
|
$body = @{
|
|
model = $ExpectedModel
|
|
input = @("поиск процедуры проведения документа 1С")
|
|
} | ConvertTo-Json -Depth 4
|
|
$embedding = Invoke-RestMethod `
|
|
-Method Post `
|
|
-Uri "$($BaseUrl.TrimEnd('/'))/v1/embeddings" `
|
|
-ContentType "application/json; charset=utf-8" `
|
|
-Body ([Text.Encoding]::UTF8.GetBytes($body)) `
|
|
-TimeoutSec 120
|
|
$dimensions = @($embedding.data[0].embedding).Count
|
|
if ($dimensions -le 0) {
|
|
throw "Embedding endpoint returned an empty vector."
|
|
}
|
|
Write-Host "Embedding endpoint is ready: model=$ExpectedModel dimensions=$dimensions url=$BaseUrl"
|
|
exit 0
|
|
}
|
|
}
|
|
catch {
|
|
$lastError = $_.Exception.Message
|
|
}
|
|
Start-Sleep -Seconds 5
|
|
} while ([DateTimeOffset]::UtcNow -lt $deadline)
|
|
|
|
docker @composeArgs logs --tail 100
|
|
throw "Embedding endpoint did not become ready in $WaitSeconds seconds. Last error: $lastError"
|