Acceso autenticado mediante un token
Si un servicio en tiempo real se encuentra en estado Running, se ha desplegado correctamente. Este servicio proporciona una API de RESTful estándar para que los usuarios invoquen. Antes de integrar la API en el entorno de producción, comisione la API. Puede utilizar los siguientes métodos para enviar una solicitud de inferencia al servicio en tiempo real:
- Método 1: Usar software basado en GUI para inferencia (Postman). (Se recomiendan Postman para Windows.)
- Método 2: Ejecutar el comando cURL para enviar una solicitud de inferencia. (Se recomiendan los comandos curl para Linux.)
- Método 3: Usar Python para enviar una solicitud de inferencia.
- Método 4: Usar Java para enviar una solicitud de inferencia.
Requisitos previos
Ha obtenido un token de usuario, ruta local al archivo de inferencia, URL del servicio en tiempo real y parámetros de entrada del servicio en tiempo real.
- Para obtener detalles sobre cómo obtener un token de usuario, consulte Autenticación basada en token. Las API de servicio en tiempo real generadas por ModelArts no admiten tokens cuyo alcance es dominio. Por lo tanto, es necesario obtener el token cuyo alcance es proyecto.
- La ruta local al archivo de inferencia puede ser una ruta absoluta (por ejemplo, D:/test.png para Windows y /opt/data/test.png para Linux) o una ruta relativa (por ejemplo, ./test.png).
- Puede obtener URL del servicio y los parámetros de entrada de un servicio en tiempo real en la página de ficha Usage Guides de su página de detalles del servicio.
La URL de API es la URL de servicio del servicio en tiempo real. Si se define una ruta para apis en el archivo de configuración del modelo, la URL debe ir seguida de la ruta definida por el usuario, por ejemplo, {URL of the real-time service}/predictions/poetry.
Figura 1 Obtención de la URL de la API y los parámetros de entrada de predicción de archivos de un servicio en tiempo real
Figura 2 Obtención de la URL de la API y los parámetros de entrada de predicción de texto de un servicio en tiempo real
Método 1: Usar software basado en GUI para inferencia (Postman)
- Descargue Postman e instalarlo, o instalar la extensión Postman Chrome. Alternativamente, utilice otro software que pueda enviar solicitudes POST. Se recomienda Postman 7.24.0.
- Active Postman. Figura 3 muestra la interfaz de Postman.
- Establezca los parámetros en Postman. A continuación se utiliza la clasificación de imágenes como ejemplo.
- Seleccione una tarea de POST y copie URL de la API en el cuadro de texto POST. En la página de pestaña Headers, establezca Key en X-Auth-Token y Value en el token de usuario.
También puede utilizar las AK y SK para cifrar las solicitudes de invocaciones a la API. Para obtener más información, véase Descripción de autenticación de sesión.
Figura 4 Configuración de parámetros
- En la página de la ficha Body, la entrada de archivo y la entrada de texto están disponibles.
- Ingreso de archivo
Seleccione form-data. Establezca KEY en el parámetro de entrada de la aplicación de IA, que debe ser el mismo que el parámetro de entrada del servicio en tiempo real. En este ejemplo, KEY es images. Establezca VALUE en una imagen que se va a inferir (solo se puede inferir una imagen). Consulte Figura 5.
- Ingreso de texto
Seleccione raw y luego JSON(application/json). Introduzca el cuerpo de la solicitud en el cuadro de texto siguiente. Un cuerpo de solicitud de ejemplo es el siguiente:
{ "meta": { "uuid": "10eb0091-887f-4839-9929-cbc884f1e20e" }, "data": { "req_data": [ { "sepal_length": 3, "sepal_width": 1, "petal_length": 2.2, "petal_width": 4 } ] } }
meta puede llevar un identificador único universal (UUID). Cuando se devuelve el resultado de la inferencia después de invocar a la API, se devuelve el UUID para rastrear la solicitud. Si no necesita esta función, deje meta en blanco. data contiene una matriz req_data para una o varias piezas de datos de entrada. Los parámetros de cada pieza de datos, como sepal_length y sepal_width en este ejemplo son determinados por la aplicación de IA.
- Ingreso de archivo
- Seleccione una tarea de POST y copie URL de la API en el cuadro de texto POST. En la página de pestaña Headers, establezca Key en X-Auth-Token y Value en el token de usuario.
- Después de establecer los parámetros, haga clic en send para enviar la solicitud. El resultado se mostrará en Response.
- Resultado de inferencia usando la entrada de archivo: Figura 6 muestra un ejemplo. Los valores de campo en el resultado devuelto varían según la aplicación de IA.
- Resultado de inferencia usando la entrada de texto: Figura 7 muestra un ejemplo. El cuerpo de la solicitud contiene meta y data. Si la solicitud contiene uuid, uuid se devolverá en la respuesta. De lo contrario, el uuid se deja en blanco. data contiene una matriz resp_data para los resultados de inferencia de una o varias piezas de datos de entrada. Los parámetros de cada resultado se determinan mediante la aplicación de IA, por ejemplo, sepal_length y predictresult en este ejemplo.
Método 2: Ejecutar el comando cURL para enviar una solicitud de inferencia
El comando para enviar solicitudes de inferencia se puede introducir como un archivo o texto.
- Ingreso de archivo
curl -kv -F 'images=@Image path' -H 'X-Auth-Token:Token value' -X POST Real-time service URL
- -k indica que se puede acceder a los sitios web SSL sin utilizar un certificado de seguridad.
- -F indica la entrada de archivo. En este ejemplo, el nombre del parámetro es images, que se pueden cambiar según sea necesario. La ruta de almacenamiento de imágenes sigue a @.
- -H indica el encabezado de un comando de POST. X-Auth-Token es la clave de encabezado, que es fija. Token value indica el token de usuario.
- POST es seguido por la URL de la API del servicio en tiempo real.
El siguiente es un ejemplo del comando cURL para inferencia con entrada de archivo:
curl -kv -F 'images=@/home/data/test.png' -H 'X-Auth-Token:MIISkAY***80T9wHQ==' -X POST https://modelarts-infers-1.xxx/v1/infers/eb3e0c54-3dfa-4750-af0c-95c45e5d3e83
- Ingreso de texto
curl -kv -d '{"data":{"req_data":[{"sepal_length":3,"sepal_width":1,"petal_length":2.2,"petal_width":4}]}}' -H 'X-Auth-Token:MIISkAY***80T9wHQ==' -H 'Content-type: application/json' -X POST https://modelarts-infers-1.xxx/v1/infers/eb3e0c54-3dfa-4750-af0c-95c45e5d3e83
-d indica la entrada de texto del cuerpo de la solicitud.
Método 3: Usar Python para enviar una solicitud de inferencia
- Descargue el SDK de Python y configúrelo en la herramienta de desarrollo. Para obtener más información, consulte Integración del SDK de Python para la firma de solicitudes de API.
- Cree un cuerpo de solicitud para inferencia.
- Ingreso de archivo
# coding=utf-8 import requests if __name__ == '__main__': # Config url, token and file path. url = "URL of the real-time service" token = "User token" file_path = "Local path to the inference file" # Send request. headers = { 'X-Auth-Token': token } files = { 'images': open(file_path, 'rb') } resp = requests.post(url, headers=headers, files=files) # Print result. print(resp.status_code) print(resp.text)
El nombre de files viene determinado por el parámetro de entrada del servicio en tiempo real. El nombre del parámetro debe ser el mismo que el del parámetro de entrada del tipo de archivo. El parámetro de entrada images obtenido en Requisitos previos es un ejemplo.
- Ingreso de texto (JSON)
A continuación se muestra un ejemplo del cuerpo de la solicitud para leer el archivo de inferencia local y realizar la codificación Base64:
# coding=utf-8 import base64 import requests if __name__ == '__main__': # Config url, token and file path url = "URL of the real-time service" token = "User token" file_path = "Local path to the inference file" with open(file_path, "rb") as file: base64_data = base64.b64encode(file.read()).decode("utf-8") # Set body,then send request headers = { 'Content-Type': 'application/json', 'X-Auth-Token': token } body = { 'image': base64_data } resp = requests.post(url, headers=headers, json=body) # Print result print(resp.status_code) print(resp.text)
El nombre de body viene determinado por el parámetro de entrada del servicio en tiempo real. El nombre del parámetro debe ser el mismo que el del parámetro de entrada del tipo de cadena. El parámetro de entrada images obtenido en Requisitos previos es un ejemplo. El valor de base64_data de body es del tipo de cadena.
- Ingreso de archivo
Método 4: Usar Java para enviar una solicitud de inferencia
- Descargue el SDK de Java y configúrelo en la herramienta de desarrollo. Para obtener más información, consulte Integración del SDK de Java para la firma de solicitudes de API.
- (Opcional) Si la entrada de la solicitud de inferencia está en el formato de archivo, el proyecto Java depende del módulo httpmime.
- Agregue httpmime-x.x.x.jar a la carpeta libs. Figura 8 muestra una biblioteca de dependencias Java completa.
Se recomienda utilizar httpmime-x.x.x.jar 4.5 o una versión posterior. Descargue httpmime-x.x.x.jar desde https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime.
- Después de agregar httpmime-x.x.x.jar, agregue la información httpmime al archivo .classpath del proyecto Java de la siguiente manera:
<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="src" path="src"/> <classpathentry kind="lib" path="libs/commons-codec-1.11.jar"/> <classpathentry kind="lib" path="libs/commons-logging-1.2.jar"/> <classpathentry kind="lib" path="libs/httpclient-4.5.13.jar"/> <classpathentry kind="lib" path="libs/httpcore-4.4.13.jar"/> <classpathentry kind="lib" path="libs/httpmime-x.x.x.jar"/> <classpathentry kind="lib" path="libs/java-sdk-core-3.1.2.jar"/> <classpathentry kind="lib" path="libs/okhttp-3.14.9.jar"/> <classpathentry kind="lib" path="libs/okio-1.17.2.jar"/> <classpathentry kind="output" path="bin"/> </classpath>
- Agregue httpmime-x.x.x.jar a la carpeta libs. Figura 8 muestra una biblioteca de dependencias Java completa.
- Cree un cuerpo de solicitud Java para inferencia.
- Ingreso de archivo
Un cuerpo de solicitud Java de ejemplo es el siguiente:
// Package name of the demo. package com.apig.sdk.demo; import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import java.io.File; public class MyTokenFile { public static void main(String[] args) { // Config url, token and filePath String url = "URL of the real-time service"; String token = "User token"; String filePath = "Local path to the inference file"; try { // Create post HttpPost httpPost = new HttpPost(url); // Add header parameters httpPost.setHeader("X-Auth-Token", token); // Add a body if you have specified the PUT or POST method. Special characters, such as the double quotation mark ("), contained in the body must be escaped. File file = new File(filePath); HttpEntity entity = MultipartEntityBuilder.create().addBinaryBody("images", file).setContentType(ContentType.MULTIPART_FORM_DATA).setCharset(Consts.UTF_8).build(); httpPost.setEntity(entity); // Send post CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost); // Print result System.out.println(response.getStatusLine().getStatusCode()); System.out.println(EntityUtils.toString(response.getEntity())); } catch (Exception e) { e.printStackTrace(); } } }
El nombre addBinaryBody viene determinado por el parámetro de entrada del servicio en tiempo real. El nombre del parámetro debe ser el mismo que el del parámetro de entrada del tipo de archivo. El archivo images obtenido en Requisitos previos se usa como ejemplo.
- Ingreso de texto (JSON)
A continuación se muestra un ejemplo del cuerpo de la solicitud para leer el archivo de inferencia local y realizar la codificación Base64:
// Package name of the demo. package com.apig.sdk.demo; import org.apache.http.HttpHeaders; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class MyTokenTest { public static void main(String[] args) { // Config url, token and body String url = "URL of the real-time service"; String token = "User token"; String body = "{}"; try { // Create post HttpPost httpPost = new HttpPost(url); // Add header parameters httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); httpPost.setHeader("X-Auth-Token", token); // Special characters, such as the double quotation mark ("), contained in the body must be escaped. httpPost.setEntity(new StringEntity(body)); // Send post. CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost); // Print result System.out.println(response.getStatusLine().getStatusCode()); System.out.println(EntityUtils.toString(response.getEntity())); } catch (Exception e) { e.printStackTrace(); } } }
body está determinado por el formato de texto. JSON se utiliza como ejemplo.
- Ingreso de archivo