Rularea LLM-urilor locale pe NPU din R cu Foundry Local și ellmer

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

TLDR: această postare rezumă modul în care am putut să folosesc Unitatea de procesare neuronală (NPU) a Surface Pro 11 pentru a discuta cu modele de limbaj mari (LLM) de la R (din anumite motive). Codul a fost adaptat din acest ghid de la Microsoft.

Succes!

Deși am folosit obsesiv LLM-urile de când a pornit pentru prima dată hype train, în ultimele 12 luni am experimentat cu LLM-uri locale, astfel încât să le pot utiliza mai bine în munca mea. În cea mai mare parte, am folosit RTX 4060 al laptopului meu pentru asta, dar am fost de multă vreme curios ce poate (sau nu) face NPU-ul integrat în Surface Pro 11. Din păcate, la momentul scrierii, nici Ollama sau LM Studio1 susțin nativ această funcționalitate care a făcut ca satisfacerea curiozității mele să fie mai dificilă decât mi-aș dori.

La început, încă nu sunt complet sigur că aceasta este o întrebare la care merită să răspund (sau un blog care merită scris), având în vedere că performanța lui RTX 4060 o depășește cu totul pe cea a NPU-ului meu, dar sunt un chinuitor și ideea de a fi blocat fără un papagal stocastic la îndemână este deloc terifiant.

Turnatorie Local

Înainte de a începe, va trebui să instalați Foundry Local, care poate fi instalat folosind comanda Bash de mai jos:

npm install foundry-local-sdk-winml openai

De asemenea, va trebui să vă asigurați că Foundry este disponibil pe PATH, astfel încât sistemul de operare să știe cum să îl lanseze (vezi aici).

Codul R

Microsoft oferă aici un ghid introductiv, care include un set de cod Python pe care s-a bazat (cu ajutorul lui Claude):

# Load necessary packages ---------------------------------------------------
library(ellmer)   # LLM chat interface (chat_openai_compatible)
library(httr2)    # resolve the exact loaded model id from /v1/models

# Set project assumptions and define functions ------------------------------
ref_model_alias <- "qwen2.5-0.5b"
ref_prompt      <- "What is the golden ratio?"

# fnc_foundry_load: ensure the service is up and the model is loaded.
fnc_foundry_load <- function(alias) {
  if (Sys.which("foundry") == "") {
    stop("`foundry` CLI not found on PATH. Install Foundry Local first.")
  }
  system2("foundry", c("service", "start"))
  system2("foundry", c("model", "download", alias))
  system2("foundry", c("model", "load", alias))
  invisible(alias)
}

# fnc_foundry_endpoint: discover the service base URL (port is dynamic).
fnc_foundry_endpoint <- function() {
  tmp_status   <- system2("foundry", c("service", "status"), stdout = TRUE)
  tmp_status   <- iconv(paste(tmp_status, collapse = " "),
                        to = "ASCII", sub = " ")
  tmp_hostport <- regmatches(
    tmp_status,
    regexpr("(0-9){1,3}(\.(0-9){1,3}){3}:(0-9)+", tmp_status)
  )
  if (length(tmp_hostport) == 0) {
    stop("Could not parse endpoint from status: ", tmp_status)
  }
  paste0("http://", tmp_hostport(1))
}

# fnc_model_id: resolve the concrete model id required by the REST API.
fnc_model_id <- function(base, alias) {
  tmp_models <- request(paste0(base, "/v1/models")) |>
    req_perform() |>
    resp_body_json(simplifyVector = FALSE)
  tmp_ids <- vapply(tmp_models$data, (m) m$id, character(1))
  tmp_hit <- tmp_ids(grepl(alias, tmp_ids, fixed = TRUE))
  if (length(tmp_hit)) tmp_hit(1) else tmp_ids(1)
}

# fnc_foundry_unload: release the model from memory.
fnc_foundry_unload <- function(alias) {
  system2("foundry", c("model", "unload", alias))
  invisible(alias)
}

fnc_foundry_load(ref_model_alias)
ref_endpoint <- fnc_foundry_endpoint()
ref_model_id <- fnc_model_id(ref_endpoint, ref_model_alias)
cat("Model loaded and ready.n")

# Point ellmer at the local OpenAI-compatible endpoint. Foundry Local needs
mod_chat <- chat_openai_compatible(
  base_url    = paste0(ref_endpoint, "/v1"),
  name        = "foundry-local",
  credentials = () "not-needed",
  model       = ref_model_id,
  echo        = "output"
)

#send prompt to local model 
rlt_reply <- mod_chat$chat(ref_prompt)

Postarea Rularea LLM-urilor locale pe NPU din R cu Foundry Local și ellmer a apărut mai întâi pe Giles.

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.