Pular para o conteúdo
Skillpedia
Machine learning280 mil · #105

pytorch-patterns

Ajuda seu agente a usar o PyTorch para criar modelos de aprendizado de máquina. Ele aplica as melhores práticas para treinar modelos de forma eficiente e garantir que os resultados sejam consistentes.

O que ela faz

Este agente ajuda a escrever código para inteligência artificial (IA) usando a biblioteca PyTorch. Ele garante que seu código seja organizado, funcione em diferentes computadores (com ou sem placa de vídeo potente) e que os resultados possam ser repetidos.

Quando usar

  • ✓Ao começar a escrever um novo modelo de IA com PyTorch.
  • ✓Ao revisar um código de IA para garantir que está seguindo as melhores práticas.
  • ✓Quando você precisa que os resultados dos seus testes de IA sejam sempre os mesmos.

Exemplo do que pedir para a IA

“Como posso garantir que meu código PyTorch funcione tanto em CPU quanto em GPU e que os resultados sejam sempre os mesmos?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/pytorch-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/pytorch-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ele verifica se o código está escrito para ser independente de onde será executado (CPU ou GPU) e se as configurações para garantir resultados repetíveis estão presentes. Também ajuda a organizar a estrutura do código e a gerenciar as dimensões dos dados.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill pytorch-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/pytorch-patterns/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões de Desenvolvimento PyTorch

Padrões idiomáticos do PyTorch e melhores práticas para construir aplicações de aprendizado profundo robustas, eficientes e reproduzíveis.

Quando Ativar

  • Escrevendo novos modelos PyTorch ou scripts de treinamento
  • Revisando código de aprendizado profundo
  • Depurando loops de treinamento ou pipelines de dados
  • Otimizando o uso de memória da GPU ou a velocidade de treinamento
  • Configurando experimentos reproduzíveis

Princípios Fundamentais

1. Código Independente de Dispositivo

Sempre escreva código que funcione tanto em CPU quanto em GPU sem codificar dispositivos.

# Good: Device-agnostic
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = MyModel().to(device)
data = data.to(device)

# Bad: Hardcoded device
model = MyModel().cuda()  # Crashes if no GPU
data = data.cuda()

2. Reprodutibilidade em Primeiro Lugar

Defina todas as sementes aleatórias para resultados reproduzíveis.

# Good: Full reproducibility setup
def set_seed(seed: int = 42) -> None:
    torch.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
    np.random.seed(seed)
    random.seed(seed)
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False

# Bad: No seed control
model = MyModel()  # Different weights every run

3. Gerenciamento Explícito de Formato (Shape)

Sempre documente e verifique os formatos dos tensores.

# Good: Shape-annotated forward pass
def forward(self, x: torch.Tensor) -> torch.Tensor:
    # x: (batch_size, channels, height, width)
    x = self.conv1(x)    # -> (batch_size, 32, H, W)
    x = self.pool(x)     # -> (batch_size, 32, H//2, W//2)
    x = x.view(x.size(0), -1)  # -> (batch_size, 32*H//2*W//2)
    return self.fc(x)    # -> (batch_size, num_classes)

# Bad: No shape tracking
def forward(self, x):
    x = self.conv1(x)
    x = self.pool(x)
    x = x.view(x.size(0), -1)  # What size is this?
    return self.fc(x)           # Will this even work?

Padrões de Arquitetura de Modelo

Estrutura Limpa de nn.Module

# Good: Well-organized module
class ImageClassifier(nn.Module):
    def __init__(self, num_classes: int, dropout: float = 0.5) -> None:
        super().__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=3, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2),
        )
        self.classifier = nn.Sequential(
            nn.Dropout(dropout),
            nn.Linear(64 * 16 * 16, num_classes),
        )

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        x = self.features(x)
        x = x.view(x.size(0), -1)
        return self.classifier(x)

# Bad: Everything in forward
class ImageClassifier(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, x):
        x = F.conv2d(x, weight=self.make_weight())  # Creates weight each call!
        return x

Inicialização Adequada de Pesos

# Good: Explicit initialization
def _init_weights(self, module: nn.Module) -> None:
    if isinstance(module, nn.Linear):
        nn.init.kaiming_normal_(module.weight, mode="fan_out", nonlinearity="relu")
        if module.bias is not None:
            nn.init.zeros_(module.bias)
    elif isinstance(module, nn.Conv2d):
        nn.init.kaiming_normal_(module.weight, mode="fan_out", nonlinearity="relu")
    elif isinstance(module, nn.BatchNorm2d):
        nn.init.ones_(module.weight)
        nn.init.zeros_(module.bias)

model = MyModel()
model.apply(model._init_weights)

Padrões de Loop de Treinamento

Loop de Treinamento Padrão

# Bom: Loop de treinamento completo com melhores práticas
def train_one_epoch(
    model: nn.Module,
    dataloader: DataLoader,
    optimizer: torch.optim.Optimizer,
    criterion: nn.Module,
    device: torch.device,
    scaler: torch.amp.GradScaler | None = None,
) -> float:
    model.train()  # Sempre defina o modo de treinamento
    total_loss = 0.0

    for batch_idx, (data, target) in enumerate(dataloader):
        data, target = data.to(device), target.to(device)

        optimizer.zero_grad(set_to_none=True)  # Mais eficiente que zero_grad()

        # Treinamento com precisão mista
        with torch.amp.autocast("cuda", enabled=scaler is not None):
            output = model(data)
            loss = criterion(output, target)

        if scaler is not None:
            scaler.scale(loss).backward()
            scaler.unscale_(optimizer)
            torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
            scaler.step(optimizer)
            scaler.update()

…
Perguntas frequentes

Por que é importante que o código funcione em CPU e GPU?

Para que você possa treinar modelos em computadores diferentes, mesmo aqueles sem uma placa de vídeo potente (GPU), tornando o código mais flexível.

O que significa 'resultados repetíveis'?

Significa que, ao executar o mesmo código com os mesmos dados, você obterá exatamente os mesmos resultados todas as vezes, o que é crucial para testar e comparar modelos.

Como o agente ajuda a organizar o código?

Ele sugere padrões de organização para as diferentes partes do modelo (como camadas e funções) e para o processo de treinamento, tornando o código mais fácil de ler e manter.

Detalhes

Descrição original do autor

PyTorch deep learning patterns and best practices for building robust, efficient, and reproducible training pipelines, model architectures, and data loading. Use when writing or reviewing PyTorch training loops, model architectures, or data loading, or when a run will not reproduce.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#105
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas