# Terminal python net.py
# necessities.txt torch transformers flask gunicorn
# net.py from flask import Flask, request import detector as detector app = Flask(__name__) @app.route('/verify', strategies=["POST"]) def handle_request(): immediate = request.type.get("immediate") if not immediate: return { "error": "immediate parameter is required" }, 400 detection = detector.detect(immediate) return { "spam": bool(detection)} app.run(host="0.0.0.0", port=8000)
# detector.py import torch from transformers import RobertaTokenizer, RobertaForSequenceClassification if torch.cuda.is_available(): print("USING CUDA") gadget = torch.gadget("cuda") elif torch.backends.mps.is_available(): print("USING Apple Steel") gadget = torch.gadget("mps") else: print("USING CPU") gadget = torch.gadget("cpu") model_path = "mshenoda/roberta-spam" tokenizer = RobertaTokenizer.from_pretrained(model_path) mannequin = RobertaForSequenceClassification.from_pretrained(model_path, num_labels=2).to(gadget) def detect(textual content): inputs = tokenizer(textual content, return_tensors="pt", padding="max_length", truncation=True, max_length=512) inputs = {okay: v.to(gadget) for okay,v in inputs.objects()} with torch.no_grad(): outputs = mannequin(**inputs) return torch.argmax(outputs.logits, dim=1)
# Dockerfile FROM python:3.11.6 RUN apt replace && apt improve -y WORKDIR /app COPY . /app RUN pip set up --no-cache-dir -r necessities.txt ENV NVIDIA_VISIBLE_DEVICES=all ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility EXPOSE 5000 CMD ["gunicorn -w 2 -b 0.0.0.0:5000 web:app"]
# docker-compose.yml model: '3.8' providers: app: # picture: USERNAME/IMAGE:newest command: gunicorn -w 2 -b 0.0.0.0:5000 net:app ports: - 5000:5000 setting: - NVIDIA_VISIBLE_DEVICES=all - NVIDIA_DRIVER_CAPABILITIES=compute,utility deploy: assets: reservations: units: - capabilities: [gpu] volumes: - /root/model-cache:/root/.cache
# Terminal rails g migration add_spam_fields_to_comments spam:boolean spam_checked_on:datetime rails g job CheckForSpam
# db/migrate/20231105020507_add_spam_fields_to_comments.rb class AddSpamFieldsToComments < ActiveRecord::Migration[7.1] def change add_column :feedback, :spam, :boolean, default: false add_column :feedback, :spam_checked_on, :datetime finish finish
# app/fashions/remark.rb class Remark < ApplicationRecord has_rich_text :content material belongs_to :submit broadcasts_to :submit # after_create_commit -> { broadcast_append_to submit } after_create_commit -> { CheckForSpamJob.perform_later self } # after_update_commit -> { broadcast_replace_to submit } # after_destroy_commit -> { broadcast_remove_to submit } finish
# app/jobs/check_for_spam_job.rb require "web/http" require "uri" require "json" class CheckForSpamJob < ApplicationJob queue_as :default def carry out(remark) immediate = remark.content material.to_plain_text uri = URI.parse("http://127.0.0.1:8000/verify") http = Web::HTTP.new(uri.host, uri.port) http.use_ssl = true if uri.scheme == "https" http.open_timeout = 10 http.read_timeout = 10 request = Web::HTTP::Publish.new(uri.request_uri) request.set_form_data({ immediate: immediate }) response = http.request(request) consequence = JSON.parse(response.physique) if outlined?(consequence["spam"]) # remark.replace(spam_checked_on: Time.now, spam: consequence["spam"]) remark.destroy if consequence["spam"] else # retry finish rescue StandardError => e # retry finish finish
# app/views/feedback/_comment.html.erb <%= turbo_frame_tag dom_id(remark), class: "card my-3 shadow-sm" do %> <%= content_tag :div, class: "card-header #{remark.spam? ? "bg-danger" : "bg-primary"} text-white" do %> <div class=""> Commented on <%= remark.updated_at.strftime("%B %d, %Y at %l:%M %p") %> </div> <% finish %> <%= content_tag :div, class: "card-body #{remark.spam? ? "bg-danger-subtle" : "bg-primary-subtle"}" do %> <p class="card-text"><%= remark.content material %></p> <% finish %> <div class="card-footer bg-transparent"> <%= link_to "Edit", [:edit, comment.post, comment], class: 'btn btn-outline-secondary btn-sm me-2' %> <%= link_to "Delete", [comment.post, comment], "data-turbo-method": :delete, "data-turbo-confirm": "Are you positive?", class: 'btn btn-outline-danger btn-sm' %> </div> <% finish %>
# app/controllers/comments_controller.rb def index # @feedback = @submit.feedback.order(updated_at: :asc) @feedback = @submit.feedback.the place(spam: false).order(updated_at: :asc) finish