O Elastic Algorithm Service (EAS) permite implantar um serviço de inferência MLLM com um único clique em cinco minutos. Este tópico descreve como implantar e chamar o serviço de inferência MLLM.
Contexto
Nos últimos anos, os grandes modelos de linguagem (LLMs) alcançaram um sucesso sem precedentes em tarefas de linguagem. Eles não apenas se destacam na geração de texto em linguagem natural, mas também demonstram capacidades robustas em cenários multitarefa, como análise de sentimentos, tradução automática e sumarização de texto. No entanto, esses modelos se limitam ao texto e não conseguem processar outras modalidades de dados, como imagens, áudio ou vídeo.
Isso impulsionou um aumento nas pesquisas sobre grandes modelos de linguagem multimodais (MLLMs). Com a adoção generalizada de modelos como o GPT-4o na indústria, os MLLMs se tornaram uma aplicação popular.
O EAS oferece uma solução com um único clique para automatizar a implantação de MLLMs. Você pode implantar um serviço de inferência MLLM popular em apenas cinco minutos.
Pré-requisitos
Ative o PAI e crie um workspace padrão. Para mais informações, consulte Activate PAI and create a default workspace.
Caso use um usuário RAM para implantar o modelo, conceda as permissões necessárias para que ele gerencie o EAS. Para mais informações, consulte Cloud product dependencies and authorization: EAS.
Implante o serviço do EAS
Faça logon no PAI console. Na parte superior da página, selecione uma região. Em seguida, selecione o workspace desejado e clique em Enter Elastic Algorithm Service (EAS).
Clique em Deploy Service. Na seção Inference Service, clique em Custom Deployment na seção Custom Model Deployment.
-
Na página Custom Deployment, configure os seguintes parâmetros principais. Para obter informações sobre outros parâmetros, consulte Custom Deployment.
Parâmetro
Descrição
Environment Information
Deployment Method
Selecione Image-based Deployment e marque a caixa de seleção Enable Web App.
Image Configuration
Na lista de imagens oficiais, selecione chat-mllm-webui > chat-mllm-webui:1.0.
NotaComo as versões são atualizadas com frequência, atualize para a versão mais recente da imagem.
Command to Run
Após selecionar uma imagem, o comando é configurado automaticamente. Modifique o
model_typepara implantar modelos diferentes. Para obter uma lista dos modelos suportados, consulte a tabela Models abaixo.Resource Information
Deployment
Selecione um tipo de instância acelerada por GPU. Recomendamos o uso de ml.gu7i.c16m60.1-gu30 para obter o melhor custo-benefício.
Após configurar os parâmetros, clique em Deploy.
Chame o serviço
Use o WebUI para inferência de modelo
Na página Elastic Algorithm Service (EAS), clique no nome do serviço de destino. No canto superior direito da página, clique em View Web App para abrir o WebUI.
Na página do WebUI, visualize a inferência do modelo. Opcionalmente, faça o upload de uma imagem na área de upload de imagens à esquerda. Na caixa de texto na parte inferior, insira sua pergunta e clique em Send para gerar uma resposta.
Use a API para inferência de modelo
-
Obtenha o endpoint e o token do serviço.
Na página Elastic Algorithm Service (EAS), clique no nome do serviço de destino. Na seção Basic Information, clique em View Endpoint Information.
No painel Invocation Method, obtenha o token e o endpoint do serviço.
-
Use a API para inferência de modelo.
O PAI fornece as três operações de API a seguir:
Executar inferência
Recupera o resultado da inferência.
NotaO WebUI e a API são mutuamente exclusivos. Se você usou o WebUI, é necessário chamar a operação
clear chat historyantes de chamar a operaçãoinfer forward.Substitua os seguintes parâmetros principais no código de exemplo:
Parâmetro
Descrição
hosts
O endpoint do serviço obtido na Etapa 1.
authorization
O token do serviço obtido na Etapa 1.
prompt
O conteúdo do seu prompt. Recomendamos o uso de inglês.
image_path
O caminho local para a imagem.
O código de exemplo a seguir mostra como chamar a API em Python:
import requests import json import base64 def post_get_history(url='http://127.0.0.1:7860', headers=None): r = requests.post(f'{url}/get_history', headers=headers, timeout=1500) data = r.content.decode('utf-8') return data def post_infer(prompt, image=None, chat_history=[], temperature=0.2, top_p=0.7, max_output_tokens=512, use_stream = True, url='http://127.0.0.1:7860', headers={}): datas = { "prompt": prompt, "image": image, "chat_history": chat_history, "temperature": temperature, "top_p": top_p, "max_output_tokens": max_output_tokens, "use_stream": use_stream, } if use_stream: headers.update({'Accept': 'text/event-stream'}) response = requests.post(f'{url}/infer_forward', json=datas, headers=headers, stream=True, timeout=1500) if response.status_code != 200: print(f"Request failed with status code {response.status_code}") return process_stream(response) else: r = requests.post(f'{url}/infer_forward', json=datas, headers=headers, timeout=1500) data = r.content.decode('utf-8') print(data) def image_to_base64(image_path): """ Convert an image file to a Base64 encoded string. :param image_path: The local path to the image. :return: A Base64 encoded string representation of the image. """ with open(image_path, "rb") as image_file: # Read the binary data of the image image_data = image_file.read() # Encode the binary data to Base64 base64_encoded_data = base64.b64encode(image_data) # Convert bytes to string and remove any trailing newline characters base64_string = base64_encoded_data.decode('utf-8').replace('\n', '') return base64_string def process_stream(response, previous_text=""): MARK_RESPONSE_END = '##END' # DO NOT CHANGE buffer = previous_text current_response = "" for chunk in response.iter_content(chunk_size=100): if chunk: text = chunk.decode('utf-8') current_response += text parts = current_response.split(MARK_RESPONSE_END) for part in parts[:-1]: new_part = part[len(previous_text):] if new_part: print(new_part, end='', flush=True) previous_text = part current_response = parts[-1] remaining_new_text = current_response[len(previous_text):] if remaining_new_text: print(remaining_new_text, end='', flush=True) if __name__ == '__main__': # Replace <service_url> with the service endpoint. hosts = '<service_url>' # Replace <token> with the service token. head = { 'Authorization': '<token>' } # get chat history chat_history = json.loads(post_get_history(url=hosts, headers=head))['chat_history'] # The content of your prompt. We recommend using English. prompt = 'Please describe the image' # Replace path_to_your_image with the local path of your image. image_path = 'path_to_your_image' image_base_64 = image_to_base64(image_path) post_infer(prompt = prompt, image = image_base_64, chat_history = chat_history, use_stream=False, url=hosts, headers=head)Obter histórico de chat
Recupera o histórico de chat.
-
Substitua os seguintes parâmetros principais no código de exemplo:
Parâmetro
Descrição
hosts
O endpoint do serviço obtido na Etapa 1.
authorization
O token do serviço obtido na Etapa 1.
Nenhum parâmetro de entrada é necessário.
-
A tabela a seguir lista os parâmetros de saída.
Parâmetro
Tipo
Descrição
chat_history
List[List]
O histórico de chat.
O código de exemplo a seguir mostra como chamar a API em Python:
import requests import json def post_get_history(url='http://127.0.0.1:7860', headers=None): r = requests.post(f'{url}/get_history', headers=headers, timeout=1500) data = r.content.decode('utf-8') return data if __name__ == '__main__': # Replace <service_url> with the service endpoint. hosts = '<service_url>' # Replace <token> with the service token. head = { 'Authorization': '<token>' } chat_history = json.loads(post_get_history(url=hosts, headers=head))['chat_history'] print(chat_history)Limpar histórico de chat
Limpa o histórico de chat.
-
Substitua os seguintes parâmetros principais no código de exemplo:
Parâmetro
Descrição
hosts
O endpoint do serviço obtido na Etapa 1.
authorization
O token do serviço obtido na Etapa 1.
Nenhum parâmetro de entrada é necessário.
Retorna a string
successapós a conclusão.
O código de exemplo a seguir mostra como chamar a API em Python:
import requests import json def post_clear_history(url='http://127.0.0.1:7860', headers=None): r = requests.post(f'{url}/clear_history', headers=headers, timeout=1500) data = r.content.decode('utf-8') return data if __name__ == '__main__': # Replace <service_url> with the service endpoint. hosts = '<service_url>' # Replace <token> with the service token. head = { 'Authorization': '<token>' } clear_info = post_clear_history(url=hosts, headers=head) print(clear_info) -