Tag: Integração API

  • SafeTensor: O formato seguro que está substituindo o .pt (PyTorch)

    O que é SafeTensor?

    O SafeTensor é um formato de serialização de tensores criado para oferecer uma alternativa segura e eficiente ao tradicional formato PyTorch `.pt` ou `.pth`. Desenvolvido inicialmente por pesquisadores da Hugging Face, esse novo padrão de salvamento de pesos de modelos de machine learning visa eliminar riscos de segurança associados ao uso de pickle — mecanismo de serialização do Python que, apesar de poderoso, pode ser explorado para execução de código malicioso.

    Se você trabalha com inteligência artificial, aprendizado de máquina ou deep learning, especialmente em ambientes com múltiplos colaboradores, como notebooks colaborativos ou servidores compartilhados, compreender o que é SafeTensor e como utilizá-lo pode melhorar tanto a segurança quanto a portabilidade dos seus projetos.

    Por que o formato SafeTensor foi criado?

    O principal motivo para a criação do SafeTensor foi a insegurança presente nos formatos tradicionais de salvamento de modelos, como os arquivos `.pt` do PyTorch, que utilizam o módulo pickle para serializar objetos Python. O pickle, embora eficiente e flexível, permite a execução arbitrária de código Python no momento do carregamento de arquivos. Isso significa que um arquivo `.pt` pode conter código malicioso que será executado automaticamente ao ser carregado, colocando em risco sistemas e dados.

    O SafeTensor resolve esse problema adotando uma estrutura simples baseada em JSON para metadados e uma matriz binária compactada que representa os tensores. Esse formato garante que os arquivos possam ser carregados de forma segura, sem a execução de nenhum código externo, sendo, portanto, imunes a ataques via execução de código malicioso embutido.

    Vantagens do SafeTensor

    • Segurança: Não executa código ao ser carregado, evitando riscos de execução de scripts maliciosos.
    • Eficiência: Armazenamento binário direto e leitura rápida dos dados.
    • Compatibilidade: Suporte crescente em bibliotecas como PyTorch, TensorFlow (via conversão) e Transformers da Hugging Face.
    • Portabilidade: Pode ser transferido entre sistemas com diferentes versões de bibliotecas ou plataformas, sem riscos.
    • Leitura parcial: Permite leitura seletiva de variáveis/tensores dentro do arquivo, útil para modelos grandes.

    Estrutura interna do SafeTensor

    O formato SafeTensor é composto por duas partes principais:

    • Header (cabeçalho): Contém metadados em formato JSON, descrevendo cada tensor, seu dtype, forma (shape), offset e comprimento.
    • Dados binários: Todos os tensores são armazenados sequencialmente como um buffer binário contínuo.

    Essa estrutura torna o arquivo simples e direto, evitando estruturas complexas como grafos de objetos (usados pelo pickle), o que também facilita o parse e análise de arquivos mesmo sem bibliotecas especializadas.

    Comparação entre SafeTensor e .pt/.pth

    Característica .pt/.pth (pickle) SafeTensor
    Segurança Inseguro (executa código) Seguro (sem execução)
    Formato Binário + pickle JSON + binário
    Leitura parcial Não Sim
    Compatibilidade PyTorch Hugging Face, PyTorch (limitado)
    Velocidade Boa Melhor

    Como usar o SafeTensor na prática

    Para começar a usar o formato SafeTensor, é necessário instalar a biblioteca oficial:

    pip install safetensors

    Salvando tensores com SafeTensor

    import torch
    from safetensors.torch import save_file
    
    # Criar alguns tensores
    data = {
        "peso1": torch.randn(3, 3),
        "peso2": torch.ones(2, 2)
    }
    
    # Salvar no formato SafeTensor
    save_file(data, "modelo.safetensors")

    Carregando tensores com SafeTensor

    from safetensors.torch import load_file
    
    data_carregado = load_file("modelo.safetensors")
    
    print(data_carregado["peso1"])

    SafeTensor na Hugging Face

    A Hugging Face tem adotado o SafeTensor como padrão para o armazenamento de modelos no seu hub. Isso significa que, ao baixar modelos recentes como o BERT, GPT-NeoX, ou LLaMA2, é possível encontrar versões já no formato `.safetensors`.

    Além disso, a biblioteca `transformers` já inclui suporte nativo ao formato, bastando garantir que o arquivo tenha a extensão correta e que o pacote `safetensors` esteja instalado.

    from transformers import AutoModel
    
    model = AutoModel.from_pretrained("nome-do-modelo", trust_remote_code=True)

    Se o modelo tiver arquivos `.safetensors`, eles serão utilizados automaticamente se o pacote estiver presente.

    Limitações e cuidados

    Apesar das inúmeras vantagens, o formato SafeTensor também possui algumas limitações:

    • Não serializa objetos Python complexos (apenas tensores).
    • Incompatível com modelos salvos por `torch.save(model)` diretamente.
    • Necessita da biblioteca `safetensors` para leitura e escrita.

    Portanto, é recomendado seu uso em ambientes onde os modelos já são serializados com os pesos em dicionários (`state_dict()`), o que é uma prática comum em ambientes profissionais.

    Como converter modelos PyTorch existentes para SafeTensor

    Se você já possui modelos treinados em formato `.pt` ou `.pth`, é possível convertê-los para SafeTensor com poucas linhas de código:

    import torch
    from safetensors.torch import save_file
    
    state_dict = torch.load("modelo_antigo.pt", map_location="cpu")
    save_file(state_dict, "modelo_convertido.safetensors")

    Exemplos de uso no mundo real

    Diversos projetos open-source e iniciativas da comunidade já adotam o SafeTensor:

    • Hugging Face Transformers: Muitos modelos vêm com `.safetensors` por padrão.
    • Spaces com Gradio: Usam SafeTensor para carregar modelos com segurança.
    • Serviços de deploy de IA: SafeTensor é preferido para ambientes de produção.

    FAQ sobre SafeTensor

    SafeTensor é mais rápido que pickle? Sim, o carregamento é mais rápido por causa do acesso direto à memória e à estrutura binária contínua.

    Posso usar SafeTensor com modelos TensorFlow? Não diretamente, mas pode-se converter os pesos para NumPy e depois salvar com a versão `safetensors.numpy`.

    Qual o tamanho dos arquivos SafeTensor? Geralmente comparável ou menor, dependendo da compressão implícita e estrutura dos tensores.

    É obrigatório usar SafeTensor? Não, mas é altamente recomendado, principalmente para quem publica modelos ou compartilha com terceiros.

    Conclusão

    O SafeTensor é uma revolução silenciosa na forma como armazenamos pesos de modelos de machine learning. Ao eliminar os riscos associados à execução de código e ao mesmo tempo manter performance, compatibilidade e simplicidade, ele se posiciona como o novo padrão seguro para modelos em produção.

    Se você ainda utiliza o formato `.pt` para compartilhar seus modelos, considere migrar para o SafeTensor. A mudança é simples e pode evitar falhas de segurança catastróficas.

    Com o suporte crescente da comunidade e ferramentas cada vez mais otimizadas, o SafeTensor está preparado para ser o novo padrão da IA moderna.

  • Integre uma IA Gratuita (Gemma 2B) ao seu Site WordPress Usando Google Colab e Cloudflare

    Aqui está o código completo em uma única célula do Colab para servir o modelo Gemma 2B usando Ollama + Cloudflare Tunnel, tudo pronto pra rodar:

    # 🧠 Servindo Gemma 2B via Ollama + Cloudflare em CPU (Colab Free Tier)
    # Alfredo Development – 2024
    
    # 1. Instala Ollama
    !curl -fsSL https://ollama.com/install.sh | sh
    
    # 2. Instala o cliente do Cloudflare Tunnel
    !wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
    !dpkg -i cloudflared-linux-amd64.deb
    
    # 3. Prepara o ambiente para o Ollama servir via rede
    import os, subprocess, threading, time, socket
    
    os.environ.update({'OLLAMA_HOST': '0.0.0.0'})
    
    def iframe_thread(port):
        while True:
            time.sleep(0.5)
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            result = sock.connect_ex(('127.0.0.1', port))
            if result == 0:
                break
            sock.close()
        p = subprocess.Popen(["cloudflared", "tunnel", "--url", f"http://127.0.0.1:{port}"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        for line in p.stderr:
            l = line.decode()
            if "trycloudflare.com " in l:
                print("\n\n🌐 Seu endpoint público está aqui:\n\n", l[l.find("http"):], "\n\n")
    
    threading.Thread(target=iframe_thread, daemon=True, args=(11434,)).start()
    
    # 4. Inicia o servidor Ollama
    !ollama serve
    

    Quer adicionar funcionalidades de Inteligência Artificial ao seu site WordPress sem gastar com APIs caras?

    Neste tutorial, vamos mostrar como você pode rodar o modelo de linguagem Gemma 2B do Google, totalmente de graça, usando o Google Colab (apenas CPU!), e disponibilizá-lo como uma API REST pública através do Cloudflare Tunnel.

    Com isso, você poderá fazer chamadas para a IA diretamente do seu WordPress para gerar textos, responder perguntas, criar resumos e muito mais!

    O que vamos cobrir:

    • Configurar um servidor de IA no Google Colab com Ollama.
    • Expor esse servidor de forma segura e pública usando Cloudflare Tunnel.
    • Carregar e testar o modelo Gemma 2B.
    • Integrar essa API de IA com seu site WordPress usando JavaScript ou PHP.

    Pré-requisitos:

    • Uma conta Google (para usar o Google Colab).
    • Um site WordPress ativo onde você tenha permissão para adicionar código (seja via editor de tema, plugins como Code Snippets/WPCode, ou construtores de página que aceitem HTML/JS).
    • Acesso a um terminal (no seu computador) para testar os comandos curl (opcional, mas recomendado).

    Etapa 1: Criando o Servidor de IA no Google Colab

    O primeiro passo é configurar o ambiente no Google Colab que irá rodar o modelo de IA.

    Acesse o Google Colab e crie um novo notebook.

    Na primeira célula do notebook, cole o código Python abaixo. Este script faz tudo: instala o Ollama (que gerencia o modelo de IA), instala o Cloudflared (para criar o túnel seguro) e inicia o servidor, expondo-o na internet.

    # Instalar Ollama
    !curl -fsSL https://ollama.com/install.sh | sh
    
    # Instalar Cloudflared (Cliente do Cloudflare Tunnel)
    !wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
    !dpkg -i cloudflared-linux-amd64.deb
    
    # Preparar e iniciar o túnel e o servidor Ollama
    import os, subprocess, threading, time, socket
    
    # Garante que o Ollama escute em todas as interfaces de rede
    os.environ.update({'OLLAMA_HOST': '0.0.0.0'})
    
    # Função para criar o túnel assim que o Ollama estiver pronto
    def iframe_thread(port):
        # Espera a porta 11434 (padrão do Ollama) ficar ativa
        while True:
            time.sleep(0.5)
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            result = sock.connect_ex(('127.0.0.1', port))
            if result == 0:
                break
            sock.close()
        print(f"Porta {port} está ativa. Iniciando Cloudflared Tunnel...")
        # Inicia o Cloudflared Tunnel e captura a URL pública
        p = subprocess.Popen(["cloudflared", "tunnel", "--url", f"http://127.0.0.1:{port}"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        for line in p.stderr:
            l = line.decode()
            # Procura pela linha que contém a URL pública gerada
            if "trycloudflare.com " in l:
                print("\n\n✅✅✅ Seu Endpoint Público da IA está pronto! ✅✅✅\n")
                # Extrai e imprime a URL
                print(f"URL Pública: {l[l.find('https'):].strip()}")
                print("\nCopie esta URL! Você vai precisar dela.\n\n")
    
    # Inicia a thread do Cloudflared em background
    threading.Thread(target=iframe_thread, daemon=True, args=(11434,)).start()
    
    # Inicia o servidor Ollama (este comando vai rodar indefinidamente)
    print("Iniciando servidor Ollama... Aguarde a URL pública aparecer acima.")
    !ollama serve

    Execute esta célula clicando no ícone de “Play” ou usando Shift + Enter.

    Aguarde a execução. Você verá logs de instalação e, eventualmente, uma mensagem como:

    ✅✅✅ Seu Endpoint Público da IA está pronto! ✅✅✅
    
    URL Pública: https://alguma-coisa-aleatoria.trycloudflare.com
    
    Copie esta URL! Você vai precisar dela.

    Importante: Copie essa URL https://....trycloudflare.com. Este é o endereço da sua API de IA pessoal! Use a URL que apareceu no SEU Colab. Para o restante deste tutorial, usaremos a URL de exemplo https://band-symptoms-tin-dress.trycloudflare.com/ (substitua pela sua).

    Etapa 2: Carregando o Modelo Gemma 2B e Testando a API

    Com o servidor rodando e a URL pública em mãos, vamos carregar o modelo Gemma 2B e fazer um teste rápido usando curl. Abra um terminal no seu computador (ou use outra célula no Colab prefixando os comandos com !).

    Baixar o Modelo Gemma 2B: (Só precisa fazer isso uma vez por sessão do Colab)

    curl https://band-symptoms-tin-dress.trycloudflare.com/api/pull -d '{ "name": "gemma:2b" }'

    Aguarde o download terminar.

    (Opcional) Manter o Modelo Carregado: Para evitar que o Ollama descarregue o modelo da memória por inatividade (o que causa lentidão na primeira resposta depois de um tempo), você pode fazer esta chamada:

    curl https://band-symptoms-tin-dress.trycloudflare.com/api/generate -d '{"model": "gemma:2b", "keep_alive": -1}'

    Fazer uma Pergunta (Teste):

    curl https://band-symptoms-tin-dress.trycloudflare.com/api/generate \
      -d '{
            "model": "gemma:2b",
            "stream": false,
            "prompt": "Explique o que é WordPress em uma frase."
          }'

    Você deve receber uma resposta em formato JSON contendo a resposta da IA no campo response. Se funcionar, sua API está pronta!

    Etapa 3: Integrando a API de IA com seu WordPress

    Agora vem a parte divertida: usar essa API no seu site WordPress. Você pode fazer isso de várias formas. Aqui estão duas opções comuns:

    Opção 1: Usando JavaScript (Ideal para interações no Front-End)

    Você pode adicionar um bloco HTML em uma página ou post (ou editar seu tema) para incluir um campo de texto e um botão que chamam sua API via JavaScript.

    Edite a página/post onde você quer adicionar a funcionalidade de IA.

    Adicione um bloco “HTML Personalizado”.

    Cole o código abaixo, lembrando de substituir a URL pela sua:

    <pre class="wp-block-code language-html"><code><h3>Converse com nossa IA (Gemma 2B)</h3>
    <textarea id="ia-prompt" rows="4" style="width:100%;" placeholder="Digite sua pergunta aqui..."></textarea>
    <button onclick="chamarGemma()">Enviar Pergunta</button>
    <div id="ia-resposta" style="margin-top: 15px; padding: 10px; border: 1px solid #ccc; min-height: 50px; background-color: #f9f9f9;">
      Aguardando sua pergunta...
    </div>
    
    <script>
    async function chamarGemma() {
      const promptUsuario = document.getElementById('ia-prompt').value;
      const divResposta = document.getElementById('ia-resposta');
      // !!! IMPORTANTE: SUBSTITUA PELA SUA URL DO CLOUDFLARE !!!
      const apiUrl = 'https://band-symptoms-tin-dress.trycloudflare.com/api/generate'; 
    
      divResposta.innerText = 'Pensando... 🧠';
    
      try {
        const response = await fetch(apiUrl, {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
          },
          body: JSON.stringify({
            model: 'gemma:2b',
            stream: false, // Mude para true se quiser resposta em tempo real (mais complexo de tratar)
            prompt: promptUsuario,
            system: "Você é um assistente prestativo que responde em português do Brasil." // Instrução opcional
          })
        });
    
        if (!response.ok) {
          throw new Error(`Erro HTTP: ${response.status}`);
        }
    
        const data = await response.json();
        divResposta.innerText = data.response || 'Não recebi uma resposta válida.';
    
      } catch (error) {
        console.error('Erro ao chamar a API Gemma:', error);
        divResposta.innerText = `Ocorreu um erro: ${error.message}. Verifique se o Colab ainda está rodando.`;
      }
    }
    </script></code></pre>

    Salve a página. Agora você terá um campo para digitar uma pergunta e receber a resposta da sua IA hospedada no Colab!

    Opção 2: Usando PHP (Ideal para gerar conteúdo no Back-End ou via Shortcodes)

    Se você prefere gerar conteúdo do lado do servidor ou criar um shortcode para usar no seu conteúdo, pode usar PHP.

    Adicione o seguinte código PHP ao arquivo functions.php do seu tema filho ou use um plugin como Code Snippets ou WPCode. Substitua a URL pela sua.

     'gemma:2b',
            'prompt' => $prompt,
            'stream' => false,
            'system' => 'Você é um assistente prestativo que responde em português do Brasil.' // Instrução opcional
        ]);
    
        $args = [
            'body'        => $body,
            'headers'     => ['Content-Type' => 'application/json'],
            'method'      => 'POST',
            'data_format' => 'body',
            'timeout'     => 120, // Aumente se as respostas demorarem muito (CPU é lento!)
        ];
    
        // Usa a função nativa do WordPress para fazer a requisição HTTP
        $response = wp_remote_post($api_url, $args);
    
        if (is_wp_error($response)) {
            $response_text = 'Erro na requisição: ' . $response->get_error_message();
        } else {
            $body = wp_remote_retrieve_body($response);
            $data = json_decode($body, true);
            if (isset($data['response']) && !empty($data['response'])) {
                $response_text = $data['response'];
            } elseif (isset($data['error'])) {
                 $response_text = 'Erro da API Ollama: ' . $data['error'];
            } else {
                // Captura o status code se disponível e não for 200 OK
                $status_code = wp_remote_retrieve_response_code($response);
                 if ($status_code !== 200) {
                     $response_text = 'Erro: Resposta inesperada da API (Código: ' . $status_code . '). Verifique se o Colab e o túnel estão ativos.';
                 } else {
                     $response_text = 'Erro: Resposta inesperada da API.';
                 }
            }
        }
        return $response_text;
    }
    
    // Criar um Shortcode [gemma_assistente prompt="Sua pergunta aqui"]
    function gemma_shortcode_func($atts) {
        // Define os atributos do shortcode e seus valores padrão
        $a = shortcode_atts([
            'prompt' => 'Olá! Quem é você?', // Prompt padrão se nenhum for fornecido
        ], $atts);
    
        // Validação básica do prompt
        if (empty(trim($a['prompt']))) {
            return '
    Erro: O prompt não pode estar vazio.
    '; } // Chama a função que faz a requisição à API, passando o prompt do shortcode $resposta = chamar_api_gemma(sanitize_text_field($a['prompt'])); // Sanitiza o prompt // Retorna a resposta para ser exibida no post/página // Escapa a saída para evitar problemas de HTML/JS maliciosos, caso a IA gere algo inseguro return '
    ' . esc_html($resposta) . '
    '; } // Registra o shortcode para que o WordPress o reconheça add_shortcode('gemma_assistente', 'gemma_shortcode_func'); ?>

    Salve as alterações.

    Agora você pode usar o shortcode [gemma_assistente prompt="Escreva um parágrafo sobre a importância de ter um blog."] em qualquer post ou página para que a IA gere o texto naquele local.

    Limitações Importantes

    Sessão do Colab: As sessões gratuitas do Google Colab não são permanentes. Elas expiram após algumas horas de uso ou cerca de 90 minutos de inatividade. Quando isso acontecer, você precisará reexecutar a célula no Colab, o que gerará uma nova URL pública do Cloudflare. Você terá que atualizar essa URL no seu código WordPress (JavaScript ou PHP).

    Desempenho: Rodar um modelo de linguagem em CPU é lento. Espere respostas que podem levar de 30 segundos a vários minutos, dependendo da complexidade da pergunta e da carga no servidor do Colab.

    Não é para Produção Crítica: Devido às limitações acima, esta solução é excelente para experimentação, projetos pessoais ou demonstrações, mas não é recomendada para aplicações comerciais de alto tráfego ou que exijam disponibilidade constante e respostas rápidas. Para isso, considere usar o Colab Pro (com GPU), alugar um servidor com GPU, ou usar APIs pagas de IA (como OpenAI, Anthropic, Google AI Studio, etc.).

    Conclusão

    Parabéns! Você configurou com sucesso uma API de IA gratuita usando Gemma 2B no Google Colab e a integrou ao seu site WordPress. Embora existam limitações, esta é uma maneira fantástica de explorar o poder dos modelos de linguagem e começar a construir funcionalidades inteligentes no seu site sem custos iniciais.

    Experimente diferentes prompts, ajuste o código e veja o que você pode criar!