Alejandro Crosa

Follow this blog

El día que me reemplazó un Bot

El día que me reemplazó un Bot Tuve uno de esos días donde te discuten cosas insólitas y sin argumentos en Twitter, me canse y decidí armar un bot que me reemplace unos días, y así no tener que lidiar con conversaciones ridículas y repetitivas. Vacaciones de Twitter!! Tendría que armar un bot que hable como yo, tuitee cosas parecidas y responda usando palabras que suelo utilizar (ademas de imágenes de memes), en un par de horas del fin de semana baje todo mi historial de tuits, los procesé removiendo usuarios, urls, y demás, finalmente pude armar un pequeño dataset de unos ~20.000 tuits. Como mi idea era armar una red neuronal y entrenarla con esos datos (estoy aprendiendo ML), agregue también algunos posts que había escrito a ese corpus de tuits y algún que otro texto que encontré por ahi que había escrito anteriormente. Después alquilé un servidor de Amazon con un buena placa de video (p2.xlarge GPU) y deje corriendo todo el finde un script que analizaba esos tuits entrenando el modelo que finalmente aprendería mi estilo de hablar. El script además imprimía pequeñas frases a medida que la red neuronal aprendía de mis textos, con lo cual cada tanto podia meterme e ir viendo pequeños avances en el aprendizaje. Al principio imprimía cosas sin sentido, pero de apoco comenzaba a aprender patrones entre las letras y de a poco comenzaba a formar palabras que tenían sentido. Después de unas horas comenzaba a escribir frases que tenían mas sentido, hasta que luego de dos días podia escribir frases que tranquilamente hubiese escrito yo mismo (aunque a veces escribía sin sentidos). Algunas de las primeras frases del bot Finalmente llegó el lunes y arme un script que se conectaba a Twitter y al recibir mensajes de otros usuario usaba ese modelo entrenado (el Alejandro Bot) y respondía como si fuese yo. La experiencia ademas de ser super divertida, me ayudo a darme de cuenta de varias cosas: No es muy descabellado pensar que con un data set muchísimo mas grande y un entrenamiento mucho mayor le resultaría muy difícil a la gente diferenciar entre un Bot o una persona real. Ser reemplazado por un Bot puede ser catastrófico si el bot tuitea algo que sea violento, misógino o directamente inapropiado usando tu identidad. Algun que otro tuit lo tuve que borrar porque me pareció inapriopiado. De hecho un usuario bloqueo al bot pensando que era una persona. Responder tuits es una actividad muy poco estructurada, pero tranquilamente se podrían generar Bots que automaticen tareas que tienen mas estructura, por ej. pagar cuentas, responder preguntas básicas, recolectar información por nosotros (asistentes virtuales, et al.) Las respuestas de los Bots no son super precisas, pero a veces como el cerebro de los humanos ajusta ante errores, llegan a interpretar cosas a partir de una frase inconexa. Dejar un Bot haciendo una tarea que a veces no nos gusta (responder tuits) es liberador y me encantaría en el futuro automatizar otros aspectos de mi vida de manera mas controlada, creo que ahi hay muchísimo futuro e industrias enteras. ¿Como se hace un bot? Hay varias formas de hacer Bots, pero acá voy a explicar como hice el mío y el de Ricardo Fort (@ricardobort). Mi Bot usó una red neuronal entrenada con mis tuits, pero generar eso es costoso ya que lleva mucho tiempo y recursos, una instancia de Amazon con un buen GPU sale aproximadamente $1 por hora , si consideras que un modelo puede tardar varios días en entrenarse completamente no es un gasto trivial. Si bien es muchísimo mas caro usar una maquina con GPU en Amazon, el tiempo de iteración te permite ver el resultado del modelo muchísimo mas rápido en vez de tener que esperar días para ver que onda lo que entrenaste, y una vez que tenés el modelo guardado en disco podes pasar el código a una maquina mas barata (no hace falta el GPU para generar las secuencias rápidamente), con un m2 para generar las frases es suficiente. Para entrenar el Bot use Tensorflow, gracias a TFLearn que es una abstracción que utiliza Tensorflow a bajo nivel. En este caso particular utilicé una red neuronal que permite predecir secuencias, es decir, dado un aprendizaje anterior y sugiriendo un valor nuevo, predice el siguiente con cierta probabilidad. En este caso el valor sugerido es una secuencia de caracteres (una frase). Lo increíble es que la red no predice frases, sino que al haber aprendido la relación entre las letras, predice la secuencia de caracteres que luego va a formar una frase. Mind blown. El entrenamiento no fue muy grande (~1 día ½)y el set de datos es muy muy pequeño con lo cual los resultados fueron buenos a veces — pero no perfectos — claramente es fácil darse cuenta que no estas hablando con una persona, muchas frases terminan siendo inconexas. Probablemente una forma de entrenamiento mejor hubiese sido entrenar la red basándola en conversaciones reales, en lugar de frases aisladas. Acá esta el código del Bot (version neuronal) básicamente la idea es correr el script bot-train.py por unos días y eso va a generar el modelo y guardarlo en el disco (model.ftl). A medida que lo entrenas podes ver el uso del GPU con el comando nvidia-smi y con htop el uso de CPU. El script bot-predict.py se conecta a tuiter con las credenciales que ingreses en el archivo .twitter y responde basado en ese modelo. La instancia de Amazon que use fue con el AMI (imagen pre-configurada) que tenia ya instalados Python, Tensorflow, etc. La pueden encontrar acá: “Deep Learning AMI Amazon Linux Version” https://aws.amazon.com/marketplace/pp/B01M0AXXQB ¿Hacemos un bot de Fort? Después de ese experimento se me ocurrió usar el set de datos de tuits de Ricardo Fort ya que el siempre tuiteo de una manera muy general y particular. Para eso baje todo el archivo de tuits e hice lo mismo que con mi Bot, el problema es que la cantidad de texto de él era mucho menor (solo ~11k tuits), con lo cual termine usando algo mucho mas barato de generar (no hace falta entrenamiento de días) usando “Markov Chains”, encontré una librería de Python que las genera de forma fácil con lo cual solo tuve que modificar el script del Bot original mínimamente. Los resultados usando Markov son relativamente buenos y muchísimo mas rápidos. Acá esta todo el código de los tres ejemplos que es bastante simple, de hecho es el primer codigo de Python que escribo.

Como entrevistarse para un trabajo en tecnología

Como entrevistarse para un trabajo en tecnología TL;DR Empeza el proceso al menos dos o tres meses antes. Idealmente esto lo empezaste mientras estas en tu trabajo actual. “Interview when you don't need it”. Practica resolver problemas sin la computadora, o usando un editor de texto solamente. Practica con otra persona. Envía el CV y aplica al manos a 10-30 empresas al mismo tiempo. Hacelos competir simultáneamente por vos. Te están entrevistando pero también estas entrevistándolos vos a ellos. Si no te gusta la gente ni la onda de la empresa es una señal importante. Negocia el sueldo siempre. Preparándose El proceso lo tenés que empezar al menos dos o tres meses. Es importantísimo que lo hagas mientras estas en otro trabajo porque eso te permite negociar sin presión (el que gana una negociación es el que se puede ir sin perder nada). Activa tu red, conecta con gente por Twitter, pregunta a gente que labura en las empresas que aplicas si les gusta y como es trabajar ahi. Vas a sorprenderte lo sincera que es la gente cuando otro dev les pregunta. Práctica, práctica y práctica Muchas de las entrevistas (aunque por suerte ahora esta cambiando) son telefónicas, y luego en persona por varias horas. Los problemas son “coding puzzles” donde evalúan si tenes conocimientos de CS básicos. Como alguien que no termino la facultad debo decir que es muy difícil y estresante rendir este formato de exámenes, pero hay sitios que te permiten practicar este tipo de entrevistas. Shotgun approach El proceso de entrevista es muy variable, lento y muy probablemente te digan que no. Cuando escucho a alguien decir que aplico a una sola empresa, la rechazaron y se deprimió me da una bronca atómica porque asi no funciona el sistema. Tenes que entrevistarte o “mandar el CV” a al menos 10, 20 o 30 empresas como mínimo. Es importante aplicar mas o menos al mismo tiempo (pero deja las que mas te gustan para el final), lo ideal es que tengas todas las ofertas mas o menos al mismo tiempo para hacerlos negociar entre ellos. Negocia siempre Tenes que negociar siempre, aunque sea por relativamente poco. La mayoría no sabe negociar, generalmente negocias con el reclutador, no tengas miedo de hacer esto. Se claro con lo que queres y a la vez amigable. La idea es que des a entender que queres algo pero que estas interesada/o en trabajar con ellos. Esto es importante porque generalmente los bonos por rendimiento suelen ser ~5%-10% del sueldo (si los hay). Te imaginas que te rechacen por negociar un porcentaje tan bajo? Publicado en https://collectednotes.com

Como hacer pizza

Como hacer pizza Internet esta lleno de recetas, tips y demás. Pero a mi me funcionaron estos pasos: Dos días antes Dos días antes de cocinar pones levadura con agua caliente (no hirviendo), lo mezclas y vas poniendo de a poco Harina 00 (Caputo o similar). Tienen que estar húmedos, pone poca harina. Haces los bollos (tamaño de la mano) y los dejas crecer una hora. Cuando están inflados los metes en la heladera. Yo los pongo en una bolsa cerrada con espacio para que crezcan y no pierdan humedad. Salsa de tomate Pelas un ajo, lo pones en aceite de Oliva y lo freís hasta que esta un poco marroncito nada mas. No te pases! Después pones el tomate, recomiendo Marzaro o enlatados como Bianco, pimienta, sal, azúcar y cocinas 20min a fuego medio. Cuando esta espeso lo sacás. El día que cocinas Preparas el horno ooni o en Argentina alguno como este muy fuerte (uso cedro y algunos briquettes) Cuando este lista la temperatura saco la masa de la heladera, espero 20-30 minutos y amaso usando esta técnica que me funciona bárbaro para hacerla bien finita. Una vez que esta estirada la masa pongo harina en la pala y pongo la salsa de tomate, un poco de queso muzzarella, un toque de Oliva y algo de Orégano (recomiendo crecer el propio, ocupa poco lugar y es facil). Todo listo. Esto es fundamental, necesitas un horno que llegue a muchísima temperatura. Pones la pizza y en 60 segundos ya esta lista 🤩 EXTRA: si tenes una plancha de hierro, caléntala muchisimo y pones la pizza unos dos minutos. Esto hace que quede muy crocante en el medio. 🍕

Suerte

Suerte Quería contarles la historia de un flaco que siempre fue un alumno mediocre, que tardo 4 años en completar solo 2 años de cursada en la universidad y al final ni siquiera pudo terminarla, abandonó. Le tomó 10 años conseguir un trabajo en tecnología, y mientras estuvo en los trabajos menos calificados que existen. Ese flaco soy yo, y ahora vivo y trabajo en Silicon Valley hace 10 años, tuve la suerte de trabajar en dos de las empresas mas importantes de Internet y haber hecho una carrera muy buena. ¿Como llegue a tener este tipo de trabajos en la industria siendo así de “mediocre”?, bueno, la respuesta corta es que principalmente tuve suerte (estuve en el lugar correcto, y en el momento adecuado), pero sobre todo perseverancia. Siempre supe que trabajar con la computadora era lo mío, aunque mis primeros trabajos no hayan tenido absolutamente nada que ver con eso: Primero trabaje en una casa de artículos de limpieza, duré solo un mes de lo malo que era. Después di clases de computación a gente mayor por unos pesos la hora, y hacia sitios web pequeños. Luego de un tiempo hice un sitio en una pequeña editorial, y trabajé en un Call Center atendiendo llamados, uno de los trabajos menos calificados que hay. Durante ese tiempo siempre hacia cosas que estaban fuera de mis tareas pero que estaban relacionadas con programar. De casualidad me ofrecieron a mi y a otros estudiantes de un curso que estaba haciendo hacer una pasantía en AFIP, ese fue mi primer trabajo serio como programador. Tres años después renuncie a AFIP, y me hice Freelance, pero no me fue tan bien. Pero tuve un golpe de suerte inesperado Lo que estaba haciendo en mi tiempo libre (programar en Ruby) era necesitado en LinkedIn y no conseguían gente. Globant me contrato para ese proyecto, trabaje muy duro, y 6 meses mas tarde, termine como empleado de LinkedIn. Me mude a Silicon Valley y logré tener un impacto grande en LinkedIn que paso de 300 a 6.000 empleados y luego salió a la bolsa. Increíble. Mientras estaba en LinkedIn aprendi a programar para iPhone (insistí después de 4 intentos fallidos), y pude especializarme en lo que quería hacer mientras estaba en el trabajo que quería cambiar. Después llego la oportunidad de ir a Twitter y ahi pude ser líder de equipo y hacer mil cosas copadas. Ahora estoy haciendo una startup con amigos y nos esta yendo muy bien, puedo administrar mi tiempo como quiero y hacer lo que me gusta. Todo esto fue principalmente suerte e insistencia. No hay secreto, no hay talentos especiales. No soy un genio ni mucho menos, al contrario soy bastante pelotudo, pero la gente siempre se detiene en lo ultimo, es realmente un proceso. El talento es solo un multiplicador, solamente te permite hacer las cosas mas rápido y alcanzar objetivos mas fácil. Nada mas. Todo esto suena a discurso motivador, y hasta aburrido, pero es real y fue mi experiencia hasta ahora. En definitiva lo que les quiero decir, es que ahora como primer paso consigan un trabajo que pague las cuentas, no van a conseguir el trabajo ideal en la industria el primer día, eso es ridículo y hasta diría contraproducente. Lo mas importante es que no dejen de hacer proyectos con la computadora, de practicar y sobre todo, de hacer. Ustedes están terminando la universidad lo cual es un logro increíble. Naturalmente van a terminar trabajando de esto, tienen suerte de estar en la industria mas demandada de la historia de la humanidad. Insistan.

roadmap

roadmap Go read it: Roadmap