From bf96a6131171883875669cf84ccd165924bb9188 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andri=20=C3=93skarsson?= Date: Sat, 11 Jan 2025 12:46:57 +0100 Subject: [PATCH] replacing classifier process with a worker --- Dockerfile | 3 + apps/classifier/package.json | 4 +- apps/jetstream/package.json | 4 +- apps/worker/.gitignore | 175 ++++++++++++++++++ apps/worker/README.md | 3 + apps/worker/crontab | 3 + apps/worker/graphile.config.ts | 18 ++ apps/worker/index.ts | 12 ++ apps/worker/package.json | 17 ++ .../tasks/classify-unclassified-posts.ts | 8 + apps/worker/tasks/cleanup.ts | 7 + .../tasks/fetch-missing-post-records.ts | 9 + apps/worker/tsconfig.json | 27 +++ bun.lockb | Bin 418376 -> 430040 bytes fly.toml | 6 +- package.json | 1 + packages/atproto/classifiers/tfjs/index.ts | 2 +- .../atproto/domain/post/post-reposts.table.ts | 4 +- packages/atproto/scripts/classifier copy.ts | 112 +++++++++++ packages/atproto/scripts/classifier.ts | 128 ++++++------- packages/db/package.json | 4 +- packages/jetstream/package.json | 1 - 22 files changed, 462 insertions(+), 86 deletions(-) create mode 100644 apps/worker/.gitignore create mode 100644 apps/worker/README.md create mode 100644 apps/worker/crontab create mode 100644 apps/worker/graphile.config.ts create mode 100644 apps/worker/index.ts create mode 100644 apps/worker/package.json create mode 100644 apps/worker/tasks/classify-unclassified-posts.ts create mode 100644 apps/worker/tasks/cleanup.ts create mode 100644 apps/worker/tasks/fetch-missing-post-records.ts create mode 100644 apps/worker/tsconfig.json create mode 100644 packages/atproto/scripts/classifier copy.ts diff --git a/Dockerfile b/Dockerfile index b40fc43..3969c0e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,10 +30,13 @@ COPY bun.lockb package.json /tmp/dev/ COPY apps/web/package.json /tmp/dev/apps/web/package.json COPY apps/jetstream/package.json /tmp/dev/apps/jetstream/package.json COPY apps/classifier/package.json /tmp/dev/apps/classifier/package.json +COPY apps/worker/package.json /tmp/dev/apps/worker/package.json COPY packages/atproto/package.json /tmp/dev/packages/atproto/package.json COPY packages/db/package.json /tmp/dev/packages/db/package.json COPY packages/jetstream/package.json /tmp/dev/packages/jetstream/package.json +# NOTE: If access denied below, then remove the bun lockfile, install and try gain +RUN cd /tmp/dev RUN cd /tmp/dev && bun install --frozen-lockfile #RUN npm rebuild @tensorflow/tfjs-node --build-from-source diff --git a/apps/classifier/package.json b/apps/classifier/package.json index d25d851..c33250f 100644 --- a/apps/classifier/package.json +++ b/apps/classifier/package.json @@ -9,9 +9,7 @@ "dependencies": { "@andrioid/atproto": "workspace:*" }, - "devDependencies": { - "@types/bun": "latest" - }, + "devDependencies": {}, "peerDependencies": { "typescript": "^5.0.0" } diff --git a/apps/jetstream/package.json b/apps/jetstream/package.json index 502977f..c5fec32 100644 --- a/apps/jetstream/package.json +++ b/apps/jetstream/package.json @@ -12,9 +12,7 @@ "dependencies": { "@andrioid/atproto": "workspace:*" }, - "devDependencies": { - "@types/bun": "latest" - }, + "devDependencies": {}, "peerDependencies": { "typescript": "^5.0.0" } diff --git a/apps/worker/.gitignore b/apps/worker/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/apps/worker/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/apps/worker/README.md b/apps/worker/README.md new file mode 100644 index 0000000..a82e4a1 --- /dev/null +++ b/apps/worker/README.md @@ -0,0 +1,3 @@ +# Graphile Worker + +https://worker.graphile.org diff --git a/apps/worker/crontab b/apps/worker/crontab new file mode 100644 index 0000000..2d6d93b --- /dev/null +++ b/apps/worker/crontab @@ -0,0 +1,3 @@ +*/15 * * * * fetch-missing-post-records +*/60 * * * * classify-unclassified-posts +0 5 * * * cleanup diff --git a/apps/worker/graphile.config.ts b/apps/worker/graphile.config.ts new file mode 100644 index 0000000..9f2782a --- /dev/null +++ b/apps/worker/graphile.config.ts @@ -0,0 +1,18 @@ +import { config } from "@andrioid/atproto/config"; +import { WorkerPreset } from "graphile-worker"; + +const preset: GraphileConfig.Preset = { + extends: [WorkerPreset], + worker: { + connectionString: config.pgURL, + maxPoolSize: 10, + pollInterval: 2000, + preparedStatements: true, + schema: "graphile_worker", + crontabFile: "crontab", + concurrentJobs: 1, + fileExtensions: [".ts"], + }, +}; + +export default preset; diff --git a/apps/worker/index.ts b/apps/worker/index.ts new file mode 100644 index 0000000..6d1b748 --- /dev/null +++ b/apps/worker/index.ts @@ -0,0 +1,12 @@ +import { run } from "graphile-worker"; +import preset from "./graphile.config"; + +async function main() { + const runner = await run({ preset }); + await runner.promise; +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/apps/worker/package.json b/apps/worker/package.json new file mode 100644 index 0000000..6e3570c --- /dev/null +++ b/apps/worker/package.json @@ -0,0 +1,17 @@ +{ + "name": "worker", + "module": "index.ts", + "type": "module", + "scripts": { + "dev": "bun --watch --env-file=../../.env index.ts", + "prod": "bun index.ts" + }, + "dependencies": { + "@andrioid/atproto": "workspace:*", + "graphile-worker": "^0.16.6" + }, + "devDependencies": {}, + "peerDependencies": { + "typescript": "^5.0.0" + } +} diff --git a/apps/worker/tasks/classify-unclassified-posts.ts b/apps/worker/tasks/classify-unclassified-posts.ts new file mode 100644 index 0000000..7609630 --- /dev/null +++ b/apps/worker/tasks/classify-unclassified-posts.ts @@ -0,0 +1,8 @@ +import { classifier } from "@andrioid/atproto/scripts/classifier"; + +export default async function classifyPostsTask( + payload: unknown, + helpers: unknown +) { + await classifier(); +} diff --git a/apps/worker/tasks/cleanup.ts b/apps/worker/tasks/cleanup.ts new file mode 100644 index 0000000..62d3e50 --- /dev/null +++ b/apps/worker/tasks/cleanup.ts @@ -0,0 +1,7 @@ +import { createAtContext } from "@andrioid/atproto"; +import { cleanupOldPosts } from "@andrioid/atproto/domain/cleanup-old-posts"; + +export default async function cleanupTask(payload: unknown, helpers: unknown) { + const ctx = await createAtContext(); + await cleanupOldPosts(ctx); +} diff --git a/apps/worker/tasks/fetch-missing-post-records.ts b/apps/worker/tasks/fetch-missing-post-records.ts new file mode 100644 index 0000000..2cae535 --- /dev/null +++ b/apps/worker/tasks/fetch-missing-post-records.ts @@ -0,0 +1,9 @@ +import { createAtContext, fetchMissingPostRecords } from "@andrioid/atproto"; + +export default async function fetchMissingPostRecordsTask( + payload: unknown, + helpers: unknown +) { + const ctx = await createAtContext(); + await fetchMissingPostRecords(ctx); +} diff --git a/apps/worker/tsconfig.json b/apps/worker/tsconfig.json new file mode 100644 index 0000000..238655f --- /dev/null +++ b/apps/worker/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/bun.lockb b/bun.lockb index 358424b09ea57cfea12be258580d47fba665e020..2c9a6e0d2f4e792483694afa88d9efa9df5aee12 100755 GIT binary patch delta 102182 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 hllohaX}*63IMsJbbJ5+ delta 94078 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 diff --git a/fly.toml b/fly.toml index f1c241b..f44ef00 100644 --- a/fly.toml +++ b/fly.toml @@ -8,7 +8,7 @@ primary_region = 'arn' [processes] app = "web" -classifier = "classifier" +worker = "worker" jetstream = "jetstream" [build] @@ -34,7 +34,7 @@ jetstream = "jetstream" cpus = 1 [[vm]] - processes=['classifier'] - memory = '2gb' + processes=['worker'] + memory = '1gb' cpu_kind = 'shared' cpus = 1 diff --git a/package.json b/package.json index 0862b89..22a3c15 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "migrate": "bun run --cwd packages/atproto db:migrate", "classifier": "bun run migrate && bun run --cwd apps/classifier prod", "jetstream": "bun run migrate && bun run --cwd apps/jetstream prod", + "worker": "bun run migrate && bun run --cwd apps/worker prod", "verify:types": "bun --filter '*' verify:types" }, "devDependencies": { diff --git a/packages/atproto/classifiers/tfjs/index.ts b/packages/atproto/classifiers/tfjs/index.ts index bff234a..3daa910 100644 --- a/packages/atproto/classifiers/tfjs/index.ts +++ b/packages/atproto/classifiers/tfjs/index.ts @@ -20,7 +20,7 @@ export const createBayesClassiferFn: FnType = async (ctx) => { // 1. Check if current model is too old const sizeOfSet = await trainingSetSize(ctx); if (sizeOfSet < MINIMUM_POST_COUNT) { - console.log("[classifier] not enough training data, aborting tfjsbayes"); + console.log("[classifier] not enough training data, not running tfjsbayes"); return; } const loader = (await isModelOutdated(ctx)) ? train : loadModelFromDb; diff --git a/packages/atproto/domain/post/post-reposts.table.ts b/packages/atproto/domain/post/post-reposts.table.ts index 43bf2d9..3c1f08a 100644 --- a/packages/atproto/domain/post/post-reposts.table.ts +++ b/packages/atproto/domain/post/post-reposts.table.ts @@ -11,7 +11,9 @@ export const repostTable = pgTable( repostUri: text("repost_uri").primaryKey(), postId: text("post_id") .notNull() - .references(() => postTable.id), + .references(() => postTable.id, { + onDelete: "cascade", // delete if post goes away + }), authorId: text("author_id"), created: timestamp({ withTimezone: true, diff --git a/packages/atproto/scripts/classifier copy.ts b/packages/atproto/scripts/classifier copy.ts new file mode 100644 index 0000000..983b0c3 --- /dev/null +++ b/packages/atproto/scripts/classifier copy.ts @@ -0,0 +1,112 @@ +import { subHours } from "date-fns"; +import { and, eq, gt, isNull } from "drizzle-orm"; +import { mutedWordsClassifier } from "../classifiers/tech/muted-words"; +import { techLinkClassifier } from "../classifiers/tech/tech-links"; +import { techWordsRegExp } from "../classifiers/tech/tech-words"; +import { createBayesClassiferFn } from "../classifiers/tfjs"; +import type { ClassifierFn } from "../classifiers/types"; +import { createAtContext } from "../context"; +import { classifyPost } from "../domain/classify-manually"; +import { cleanupOldPosts } from "../domain/cleanup-old-posts"; +import { postRecords } from "../domain/post/post-record.table"; +import { postTags } from "../domain/post/post-tag.table"; +import { postTable } from "../domain/post/post.table"; + +export const LISTEN_NOTIFY_POSTQUEUE = "atproto.postqueue"; + +export async function classifier() { + const birthDay = new Date(); // We'll let it rest a bit after a while + + // 1. Process existing records in batches + const ctx = await createAtContext(); + await cleanupOldPosts(ctx); + + const classifiers: Array = [ + mutedWordsClassifier, + techWordsRegExp, + techLinkClassifier, + ]; + + const bayes = await createBayesClassiferFn(ctx); + if (bayes) classifiers.push(bayes); + + const res = await ctx.db + .select() + .from(postTable) + .innerJoin(postRecords, eq(postTable.id, postRecords.postId)) + .leftJoin(postTags, eq(postTable.id, postTags.postId)) + .where( + and( + gt(postTable.created, subHours(new Date(), 2)), + isNull(postTags.postId) + ) + ); + // TODO: Only process unprocessed posts + + console.log("[classifier] processing older posts", res.length); + + for (const pr of res) { + for (const cf of classifiers) { + const record = pr.post_record.value; + if (!record) continue; + const res = await cf({ + ctx, + post: { + uri: pr.post.id, + record: record, + cid: pr.post_record.cid, + }, + }); + if (res.score === null) continue; + await classifyPost(ctx, { + algorithm: cf.name, + postUri: pr.post.id, + score: res.score as number, + tag: res.tag, + }); + } + } + // 2. Listen/Notify from Postgres + async function handleNewPosts(payload: string) { + const jsonP = JSON.parse(payload) as { uri: string }; + const t0 = performance.now(); + + const [p] = await ctx.db + .select({ + uri: postTable.id, + cid: postRecords.cid, + record: postRecords.value, + }) + .from(postTable) + .innerJoin(postRecords, eq(postTable.id, postRecords.postId)) + .where(eq(postTable.id, jsonP.uri)); + + for (const cf of classifiers) { + if (!p.record) continue; + const res = await cf({ + ctx, + post: { + uri: p.uri, + record: p.record, + cid: p.cid, + }, + }); + if (res.score === null) continue; + await classifyPost(ctx, { + algorithm: cf.name, + postUri: p.uri, + score: res.score as number, + tag: res.tag, + }); + } + const t1 = performance.now(); + + console.log(`[classifier] ${p.uri} in ${(t1 - t0).toFixed(2)} ms`); + if (new Date().getTime() - birthDay.getTime() > 2 * 60 * 60 * 1000) { + // Time to rest. Fly will launch another one. + process.exit(42); + } + } + console.log("[classifier] listening for new posts..."); + await ctx.db.$client.listen(LISTEN_NOTIFY_POSTQUEUE, handleNewPosts); +} diff --git a/packages/atproto/scripts/classifier.ts b/packages/atproto/scripts/classifier.ts index 983b0c3..e39399a 100644 --- a/packages/atproto/scripts/classifier.ts +++ b/packages/atproto/scripts/classifier.ts @@ -1,5 +1,4 @@ -import { subHours } from "date-fns"; -import { and, eq, gt, isNull } from "drizzle-orm"; +import { and, eq, inArray, isNull } from "drizzle-orm"; import { mutedWordsClassifier } from "../classifiers/tech/muted-words"; import { techLinkClassifier } from "../classifiers/tech/tech-links"; import { techWordsRegExp } from "../classifiers/tech/tech-words"; @@ -7,19 +6,15 @@ import { createBayesClassiferFn } from "../classifiers/tfjs"; import type { ClassifierFn } from "../classifiers/types"; import { createAtContext } from "../context"; import { classifyPost } from "../domain/classify-manually"; -import { cleanupOldPosts } from "../domain/cleanup-old-posts"; import { postRecords } from "../domain/post/post-record.table"; import { postTags } from "../domain/post/post-tag.table"; -import { postTable } from "../domain/post/post.table"; export const LISTEN_NOTIFY_POSTQUEUE = "atproto.postqueue"; +const POSTS_PER_CLASSIFIER_RUN = 500; -export async function classifier() { - const birthDay = new Date(); // We'll let it rest a bit after a while - +export async function classifier(postUri?: Array) { // 1. Process existing records in batches const ctx = await createAtContext(); - await cleanupOldPosts(ctx); const classifiers: Array = [ mutedWordsClassifier, @@ -27,86 +22,77 @@ export async function classifier() { techLinkClassifier, ]; + // If not enough training data, the bayes classifier is skipped const bayes = await createBayesClassiferFn(ctx); if (bayes) classifiers.push(bayes); - const res = await ctx.db - .select() - .from(postTable) - .innerJoin(postRecords, eq(postTable.id, postRecords.postId)) - .leftJoin(postTags, eq(postTable.id, postTags.postId)) - .where( - and( - gt(postTable.created, subHours(new Date(), 2)), - isNull(postTags.postId) - ) - ); - // TODO: Only process unprocessed posts - - console.log("[classifier] processing older posts", res.length); - - for (const pr of res) { - for (const cf of classifiers) { - const record = pr.post_record.value; - if (!record) continue; - const res = await cf({ - ctx, - post: { - uri: pr.post.id, - record: record, - cid: pr.post_record.cid, - }, - }); - if (res.score === null) continue; - await classifyPost(ctx, { - algorithm: cf.name, - postUri: pr.post.id, - score: res.score as number, - tag: res.tag, - }); + for (const classifier of classifiers) { + if (!classifier.name) { + console.warn("Classifier has no name, ignoring"); + continue; } - } - // 2. Listen/Notify from Postgres - async function handleNewPosts(payload: string) { - const jsonP = JSON.parse(payload) as { uri: string }; - const t0 = performance.now(); - - const [p] = await ctx.db + // TODO: Pagination, so we only handle 100 posts at a time + const unclassifiedPosts = await ctx.db .select({ - uri: postTable.id, - cid: postRecords.cid, + postId: postRecords.postId, record: postRecords.value, + cid: postRecords.cid, }) - .from(postTable) - .innerJoin(postRecords, eq(postTable.id, postRecords.postId)) - .where(eq(postTable.id, jsonP.uri)); + .from(postRecords) + .leftJoin( + postTags, + and( + eq(postRecords.postId, postTags.postId), + eq(postTags.algo, classifier.name) + ) + ) + .where( + and( + isNull(postTags.postId), + // If specified, otherwise ignore + postUri ? inArray(postRecords.postId, postUri) : undefined + ) + ) + .groupBy(postRecords.postId, postTags.algo); - for (const cf of classifiers) { - if (!p.record) continue; - const res = await cf({ + console.log( + `[classifier: ${classifier.name}] ${unclassifiedPosts.length} pending classification` + ); + if (unclassifiedPosts.length === 0) { + continue; + } + const t0 = performance.now(); + let ignoreCount = 0; + let classifiedCount = 0; + for (const pr of unclassifiedPosts) { + if (!pr.record) continue; + const res = await classifier({ ctx, post: { - uri: p.uri, - record: p.record, - cid: p.cid, + uri: pr.postId, + record: pr.record, + cid: pr.cid, }, }); - if (res.score === null) continue; + if (res.score === null) { + ignoreCount++; + continue; + } + classifiedCount++; await classifyPost(ctx, { - algorithm: cf.name, - postUri: p.uri, + algorithm: classifier.name, + postUri: pr.postId, score: res.score as number, tag: res.tag, }); } const t1 = performance.now(); - - console.log(`[classifier] ${p.uri} in ${(t1 - t0).toFixed(2)} ms`); - if (new Date().getTime() - birthDay.getTime() > 2 * 60 * 60 * 1000) { - // Time to rest. Fly will launch another one. - process.exit(42); - } + console.log( + `[classifier ${ + classifier.name + }] Classified ${classifiedCount}, ignored ${ignoreCount} in ${( + t1 - t0 + ).toFixed(2)} ms` + ); } - console.log("[classifier] listening for new posts..."); - await ctx.db.$client.listen(LISTEN_NOTIFY_POSTQUEUE, handleNewPosts); } diff --git a/packages/db/package.json b/packages/db/package.json index b067a2d..a79c8bc 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -4,9 +4,7 @@ "scripts": { "dev": "cd ../../ && docker compose up" }, - "devDependencies": { - "@types/bun": "latest" - }, + "devDependencies": {}, "peerDependencies": { "typescript": "^5.0.0" } diff --git a/packages/jetstream/package.json b/packages/jetstream/package.json index 372d208..ae0e48a 100644 --- a/packages/jetstream/package.json +++ b/packages/jetstream/package.json @@ -3,7 +3,6 @@ "module": "index.ts", "type": "module", "devDependencies": { - "@types/bun": "latest", "@atproto/api": "^0.13.25" }, "peerDependencies": { -- 2.51.2